2011-11-27 3 views
2

나는 안드로이드 용 미니 게임을하고있다. 이 코드를 게임 루프에 사용하고 있습니다.android game loop sleep

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 클래스 예제입니다.

코드가 정상적으로 작동합니다. 나는 새로운 게임 버튼을위한 활동을 가지고있다. 처음 활동에 들어가면 효과가 있습니다. 그러나 게임을 종료하고 속도를 다시 입력하면 속도가 빨라집니다. 실 거하지 못하거나 이해하지 못하는 것입니다. 게임을 종료하고 새 게임 버튼을 사용하여 다시 입력하면 속도가 훨씬 빨라집니다.

아무도 도와 줄 수 있습니까?

답변

0

호출되는 update()의 속도는 절대로 동일하지 않습니다. 하나의 루프는 16 밀리 초가 걸릴 수 있으며 다음 루프는 14 밀리 초만 걸릴 수 있으며 시간이 지남에 따라 계속 변합니다.

고정 속도로 반복적으로 시도해 봐야 게임이 일정한 속도로 계속 실행됩니다. 이 글을 읽고

보십시오 : http://obviam.net/index.php/the-android-game-loop/ 여기에 흥미로운 토론이 : 나는 활동에 onPause를 오버라이드 (override) 문제를 해결하기 위해 관리해야 http://www.java-gaming.org/index.php?topic=21372.0

+0

감사합니다. 나는 그들을 들여다 볼 것이다. onPause를 무시하고 postDelay를 사용하여 문제를 해결할 수 있습니다. 여기에 새로운 RefreshHandler 클래스가 있습니다. –

1

가. 새 코드는 다음과 같습니다.

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); 
    } 
};