安卓游戏循环睡眠

时间:2011-11-27 06:21:01

标签: android sleep game-loop

我正在开发适用于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类示例。

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

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分: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);
    }
};

答案 1 :(得分:0)

调用update()的速度永远不会相同。一个循环可能需要16毫秒,下一个循环可能只需要14毫秒,并且它会随着时间的推移而不断变化。

你需要尝试让它以固定的速率循环,这将使你的游戏以一致的速度运行。

请仔细阅读:http://obviam.net/index.php/the-android-game-loop/,这里有一个有趣的讨论:http://www.java-gaming.org/index.php?topic=21372.0