2011-11-27 95 views
2

我正在爲Android設計一款迷你遊戲。我在遊戲循環中使用此代碼。安卓遊戲循環睡眠

private RefreshHandler mRedrawHandler = new RefreshHandler(); 

class RefreshHandler extends Handler { 

    @Override 
    public void handleMessage(Message msg) { 
     Panel.this.update(); 
     Panel.this.invalidate(); 
    } 

    public void sleep(long delayMillis) { 
     this.removeMessages(101); 
     sendMessageDelayed(obtainMessage(101), delayMillis); 
    } 
}; 

public void update() { 
    if (mMode == RUNNING) { 
     ball.update(NR_PIX); 

     for (int i=0; i<N; i++) { 
      bords[i].update(NR_PIX); 
     } 

     Panel.lastBordHeight -= NR_PIX; 

     if (mYBrickOffset == 0) 
      mYBrickOffset = mYBrick; 

     mYBrickOffset -= NR_PIX; 

     mRedrawHandler.sleep(mMoveDelay); 
    } 
} 

RefreshHandler類來自SnakeView類示例。

該代碼工作正常。我有一個新遊戲活動按鈕。當我第一次進入活動時,它是有效的。但如果我退出遊戲並再次進入速度更快,那我不會理解或不理解的東西。如果我退出遊戲並使用New Game按鈕再次輸入,速度會更快。

任何人都可以幫助我嗎?

回答

0

update()被調用的速度永遠不會相同。一個循環可能需要16毫秒,下一個循環可能只需要14毫秒,並且會隨着時間的推移而不斷變化。

你需要嘗試讓它以固定的速度循環,這將保持你的遊戲運行速度一致。

嘗試閱讀本:http://obviam.net/index.php/the-android-game-loop/並有一個有趣的討論在這裏:http://www.java-gaming.org/index.php?topic=21372.0

+0

感謝您的鏈接。我會研究他們。我設法解決onPause和使用postDelay的問題。這是我的新的RefreshHandler類。 –

1

我已成功地解決了活動覆蓋的onPause問題。以下是新代碼:

class RefreshHandler extends Handler { 
    Handler h = new Handler(); 
    Run run = new Run(); 

    class Run implements Runnable { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      Panel.this.update(); 
      Panel.this.invalidate(); 
     } 
    } 

    public void sleep(long delayMillis) { 
     h.postDelayed(run, delayMillis); 
    } 

    public void sleepCanceled() { 
     h.removeCallbacks(run); 
    } 
};