2013-05-29 155 views
0

我正在做一个简单的比赛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 --------------------------------------- 

回答

0

我建议使用libgdx其简单的框架,你不需要计算DeltaTime。 AFAIK不要使用线表单上的线程睡眠使用单独的线程并锁定画布。

+0

我知道libgdx和其他一些框架,但我已经做了这么多,现在的编码。你能否解释一下你在最后一句中写的是什么意思?代码示例? –

+0

@ 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 –

+0

@TheDarkKnight OK,不知道我该如何继续,但我想最好使用TimerTask。我必须测试更多。 –

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

     } 
    } 
    }