2017-07-01 106 views
0

所以我有一个蛇的应用程序,我试图让它在新的运行前等待屏幕触摸。PostDelayed功能越来越快

我想最好的方法是让代码停止更新蛇并继续UI更新。所以我有一个正在运行的游戏状态和一个丢失的状态。

当我玩第一款游戏时,它会像它应该那样,但是当我死去并且结束时它会变得越来越快。

我在想,这是我的方式调用PostDelay方法在运行和丢失。但是,如果我只是在跑步中称呼它并让其丢失,那么在没有任何停顿的情况下再次运行游戏就可以顺利运行。

private void startUpdateHandler(){ 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 

      if (gameEngine.getCurrentGameState() == GameState.running){ 
       gameEngine.Update(); 
       handler.postDelayed(this, updateDelay); 
      } 

      if (gameEngine.getCurrentGameState() == GameState.lost){ 
       if (trial) { 
        onGameLost(); 
        trial = false; 
       } 
       if (touch){ 
        gameEngine.initgame(); 
        gameEngine.setToRunning(); 
        trial = true; 
       } 
       handler.postDelayed(this, updateDelay); 
      } 

      snakeView.setSnakeViewMap(gameEngine.getMap()); 
      snakeView.invalidate(); 
     } 
    }, updateDelay); 
} 

我可能无法获得postDelayed方法,我尝试搜索暂停代码并等待点击的方法。但是这只是打破了我的代码。如果我在死亡和重新开始之间没有任何延迟,我就可以使用代码。

新的到stackoverflow,所以如果我的问题是坏的我会尝试修复它!

*****编辑******

这解决了我自己,我把handler.postDelayed(这一点,updateDelay);在运行功能的后面。我看到,当我有3000毫秒的延迟时间,每次我死的时候,它每跳一次就跳过一次额外的时间,当我有3个handler.postDelayed(this,updateDelay);每移动一次,它都会跳过2次。

所以我得出结论,如果我写postdelay超过1次,它会随着时间的推移而堆积起来。不知道为什么,但它现在完美的作品,我会很感激任何人可以解释这一点!

回答

0

我不确定你的内部函数是如何工作的,但是你可能有改变状态的方法,而且由于你有两个非内置的如果调用它可能会多次调用处理程序。我也觉得这会不断添加到堆栈上并最终导致溢出错误。您可以使用开关或其他方法解决第一个问题。

您可能还需要考虑使用类似实现的间隔,然后在必要时更新间隔。看看Android的Timer

+0

哦......是的,这是有道理的大声笑,总是忘记如果其他嘿。好吧,我会看着它!这是我使用Java的android的拳头应用程序,所以我不熟悉正确获取更新的方法 –