我正在做一个简单的match-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 ---------------------------------------发布于 2013-05-29 15:09:22
我建议使用libgdx,这是一个简单的frameWork,你不需要计算DeltaTime。AFAIK不要在表面上使用线程休眠,使用单独的线程并锁定画布。
发布于 2014-04-30 21:38:06
你可以使用android动画。fadein fadeout变得花哨。
//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++){
}
}
}https://stackoverflow.com/questions/16807476
复制相似问题