2017-07-01 93 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的拳頭應用程序,所以我不熟悉正確獲取更新的方法 –