私は単純なマッチ 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 ---------------------------------------