我正在做一个简单的三消游戏,我目前正在使用类似下面代码的游戏循环。我正在使用一些帧计算来获得最佳游戏速度。我从我之前做过的另一场比赛中得到了这个。但这对于这种类型的游戏来说似乎是不必要的。
我需要在几个地方有一些时间延迟,比如当我在游戏区域上移动了一个对象时,我希望在调用一个检查是否连续三个对象匹配的方法之前有一个短暂的延迟。然后当代码检测到匹配时,我还需要一个短时间延迟,以便在用户开始移动另一个对象然后检查匹配之前,我可以在游戏网格中的那些位置做一些简单的效果。
因为现在每件事都会同时发生,我想知道在没有这种帧计算的情况下运行这个游戏是否会更好,我该怎么做才能得到一些时间延迟?我已经测试过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 ---------------------------------------