0

私は単純なマッチ 3 ゲームを行っており、現在、以下のコードのようなゲーム ループを使用しています。ゲームの最適な速度のために、いくつかのフレーム計算を使用しています。これは、以前に行った別のゲームから取得しました。しかし、これはこのタイプのゲームには不要なようです。

ゲームエリアでオブジェクトを移動したときなど、いくつかの場所で時間遅延が必要です。3 つのオブジェクトが連続して一致するかどうかを確認するメソッドを呼び出す前に、短い時間遅延が必要です。また、ユーザーが別のオブジェクトを動かして一致を確認する前に、ゲーム グリッド内のそれらの位置で簡単な効果を実行できるように、コードが一致を検出したときに短い時間遅延も必要です。

現在、すべてが一度に発生するため、このフレームの計算を行わずにこのゲームを実行した方がよいのではないかと思います。代わりに、時間の遅延を得るにはどうすればよいでしょうか? このコード内での使用をテストしましThread.sleep(250)たが、期待どおりに動作しませんでした。

このようなゲームを実行するためのより良いアプローチは何でしょうか?

// 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 ---------------------------------------
4

2 に答える 2

0

Androidのアニメーションを使用できます。フェードイン フェードアウトをファンシーに。

//some other method to delay
new Handler().postDelayed(new Runnable()
{
 @Override
 public void run()
 {
   // your code here
 }
}, 1000/* 1sec delay */);

また、非常に不十分な解決策を得ました

 //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++){

       }
    }
  }
于 2014-04-30T13:38:05.647 に答える
0

シンプルなフレームワークであるlibgdxを使用することをお勧めします。DeltaTimeを計算する必要はありません。私の知る限り、サーフェスホルダーでスレッドスリープを使用しないでください。別のスレッドを使用してキャンバスをロックしてください。

于 2013-05-29T07:09:21.933 に答える