我正在做一个简单的比赛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 ---------------------------------------
我知道libgdx和其他一些框架,但我已经做了这么多,现在的编码。你能否解释一下你在最后一句中写的是什么意思?代码示例? –
@ 3D-kreativ:'Thread.sleep'不适合使用,因为它有时会成为设计不佳的程序的重要组成部分。看看这里:http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx。如果你想申请'睡眠'状态,那么你可以试试'TimerTask':http://stackoverflow.com/questions/1453295/timer-timertask-versus-thread-sleep-in-java –
@TheDarkKnight OK,不知道我该如何继续,但我想最好使用TimerTask。我必须测试更多。 –