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

アクティビティで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

呼び出される update() の速度は決して同じではありません。1 つのループに 16 ミリ秒かかる場合があり、次のループには 14 ミリ秒しかかからず、時間の経過とともに変化し続けます。

固定レートでループするようにする必要があります。これにより、ゲームの実行速度が一定に保たれます。

これを読んでみてください: http://obviam.net/index.php/the-android-game-loop/ここに興味深い議論があります: http://www.java-gaming.org/index.php?topic= 21372.0

于 2011-11-27T09:54:09.033 に答える