我正在开发适用于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类示例。
代码工作正常。我有一个新游戏活动按钮。当我第一次进入活动它是有效的。但是,如果我退出游戏并再次进入速度,速度会更快,这是我不会理解的事情。如果我退出游戏并使用新游戏按钮再次输入,速度会更快。
任何人都可以帮我吗?
答案 0 :(得分:1)
我设法解决了在Activity中覆盖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);
}
};
答案 1 :(得分:0)
调用update()的速度永远不会相同。一个循环可能需要16毫秒,下一个循环可能只需要14毫秒,并且它会随着时间的推移而不断变化。
你需要尝试让它以固定的速率循环,这将使你的游戏以一致的速度运行。
请仔细阅读:http://obviam.net/index.php/the-android-game-loop/,这里有一个有趣的讨论:http://www.java-gaming.org/index.php?topic=21372.0