首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间延迟和游戏循环

时间延迟和游戏循环
EN

Stack Overflow用户
提问于 2013-05-29 15:02:05
回答 2查看 733关注 0票数 0

我正在做一个简单的match-3游戏,目前我正在使用如下代码所示的游戏循环。我正在使用一些帧计算来获得游戏的最佳速度。这是我之前做过的另一个游戏中的内容。但对于这种类型的游戏,这似乎是不必要的。

我需要在几个地方有一些时间延迟,比如当我在游戏区域上移动一个对象时,我希望在调用一个方法之前有一个很短的时间延迟,该方法检查是否有连续三个对象的匹配。然后,当代码检测到匹配时,我还需要一个很短的时间延迟,这样我就可以在用户开始移动另一个对象之前,在游戏网格中的这些位置做一些简单的效果,然后检查匹配。

就像现在一样,所有的事情都是同时发生的,我想知道如果运行这个游戏而不计算帧会不会更好,我如何才能得到一些时间延迟呢?我已经测试过在这段代码中使用Thread.sleep(250),但是没有按照我期望的方式工作。

还有什么更好的方法来运行这样的游戏呢?

代码语言:javascript
复制
// Game loop ---------------------------------------
@Override
public void run() {
    // TODO Auto-generated method stub

    long beginTime;
    long timeDiff;
    int sleepTime;
    int framesSkipped;

    sleepTime = 0;

    while (gameRunning) {
        if (!surfaceHolder.getSurface().isValid())
            continue;

        try {
            canvas = surfaceHolder.lockCanvas();

            beginTime = System.currentTimeMillis();
            framesSkipped = 0;

            // Different game states
            switch (gameState) {

            case 0: // Intro game
                drawStartPage(canvas);
                break;

            case 1: // Play game
                canvas.drawRGB(0,0,0);

                if(touchActionDown) {
                    touchActionDown = false;
                    colorObjectManager.checkPosition(touchX, touchY);
                    touchActionMove = false;
                }

                if(touchActionMove) {
                    touchActionMove = false;
                    colorObjectManager.swapObject(moveDirection);
                    // Time delay
                    colorObjectManager.checkMatch();
                    // Time delay
                }

                // Call method to draw objects on screen
                colorObjectManager.drawObjectsList(canvas);
                break;

            case 2: // End game

                break;

            }

            // Calculate difference from first call to
            // System.currentTimeMillis() and now
            timeDiff = System.currentTimeMillis() - beginTime;
            // Calculate sleepTime
            sleepTime = (int) (FRAME_PERIOD - timeDiff);

            if (sleepTime > 0) {

                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                }
            }

            while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
                // Call method to only update objects on screen
                updateObjects();
                sleepTime += FRAME_PERIOD;
                framesSkipped++;
            }

        } finally {

            surfaceHolder.unlockCanvasAndPost(canvas);

        }

    } // End while-loop
}

// End game loop ---------------------------------------
EN

回答 2

Stack Overflow用户

发布于 2013-05-29 15:09:22

我建议使用libgdx,这是一个简单的frameWork,你不需要计算DeltaTime。AFAIK不要在表面上使用线程休眠,使用单独的线程并锁定画布。

票数 0
EN

Stack Overflow用户

发布于 2014-04-30 21:38:06

你可以使用android动画。fadein fadeout变得花哨。

代码语言:javascript
复制
//some other method to delay
new Handler().postDelayed(new Runnable()
{
 @Override
 public void run()
 {
   // your code here
 }
}, 1000/* 1sec delay */);

也得到了一个非常差劲的解决方案

代码语言:javascript
复制
 //for 5 second of delay
 for(int i=0;i<5000:i++){
    for(int k=0;k<5000:k++){
       for(int j=0;j<5000:j++){

       }
    }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16807476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档