2

我正在开发一款适用于 Android 的迷你游戏。我将此代码用于游戏循环。

private RefreshHandler mRedrawHandler = new RefreshHandler();

class RefreshHandler extends Handler {

    @Override
    public void handleMessage(Message msg) {
        Panel.this.update();
        Panel.this.invalidate();
    }

    public void sleep(long delayMillis) {
        this.removeMessages(101);
        sendMessageDelayed(obtainMessage(101), delayMillis);
    }
};

public void update() {
    if (mMode == RUNNING) {
        ball.update(NR_PIX);

        for (int i=0; i<N; i++) {
            bords[i].update(NR_PIX);
        }

        Panel.lastBordHeight -= NR_PIX;

        if (mYBrickOffset == 0)
            mYBrickOffset = mYBrick;

        mYBrickOffset -= NR_PIX; 

        mRedrawHandler.sleep(mMoveDelay);
    }
}

RefreshHandler 类来自 SnakeView 类示例。

代码工作正常。我有一个新游戏按钮的活动。当我第一次进入活动时,它是有效的。但是,如果我退出游戏并再次进入速度会更快,这是我不会或不理解的事情。如果我退出游戏并使用“新游戏”按钮再次进入,速度会更快。

谁能帮我这个 ?

4

2 回答 2

1

我已经设法解决了在 Activity 中覆盖 onPause 的问题。这是新代码:

class RefreshHandler extends Handler {
    Handler h = new Handler();
    Run run = new Run();

    class Run implements Runnable {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            Panel.this.update();
            Panel.this.invalidate();
        }
    }

    public void sleep(long delayMillis) {
        h.postDelayed(run, delayMillis);
    }

    public void sleepCanceled() {
        h.removeCallbacks(run);
    }
};
于 2011-11-28T07:39:29.883 回答
0

The speed of update() being called is never the same. One loop may take 16 milliseconds and the next loop may only take 14 milliseconds and it will continue to vary over time.

You need to try get it to loop at a fixed rate, this will keep your game running ant a consistent speed.

Try reading this: http://obviam.net/index.php/the-android-game-loop/ and there is an interesting discussion here: http://www.java-gaming.org/index.php?topic=21372.0

于 2011-11-27T09:54:09.033 回答