我不会用paint()
那种方式,不。 paint()
应该是为了绘画……绘画。我会将您对用户输入的监控和游戏逻辑处理拆分到该方法之外。
您是否考虑过使用Canvas 的 GameCanvas 子类?
它为您提供了一些不错的双缓冲功能。您将创建另一个线程,该线程将调用您的 GameCanvasrun()
方法,在其中检查用户输入,更新游戏逻辑,然后绘制到屏幕外缓冲区,最后触发屏幕缓冲区的重新绘制。
像这样的东西:
class MyGameCanvas extends GameCanvas implements Runnable {
/** start this game! */
public void start() {
Thread worker = new Thread(this);
worker.start();
}
/** run the game loop */
public void run() {
// Get the Graphics object for the off-screen buffer
Graphics g = getGraphics();
while (true) {
// Check user input and update positions if necessary
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
sprite.move(-1, 0);
}
else if ((keyState & RIGHT_PRESSED) != 0) {
sprite.move(1, 0);
}
// Clear the background to white
g.setColor(0xFFFFFF);
g.fillRect(0,0,getWidth(), getHeight());
// Draw the Sprite
sprite.paint(g);
// Flush the off-screen buffer
flushGraphics();
try {
// TODO: of course, you might want a more intelligent
// sleep interval, that reflects the amount of time
// remaining (if any) in the cycle ...
Thread.sleep(10); //sleep 10 ms
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
请注意run()
,为简洁起见,我基本上将所有内容都放在了方法中。我假设您的游戏更复杂,并且需要拆分单独的方法来获取用户输入、更新逻辑,然后调用图形/绘画方法。这些都将从run()
.
用法
在您的 MIDlet 的startApp()
方法中启动它:
MyGameCanvas gameCanvas = new MyGameCanvas();
gameCanvas.start();
exitCommand = new Command("Exit", Command.EXIT, 1);
gameCanvas.addCommand(exitCommand);
gameCanvas.setCommandListener(this);
Display.getDisplay(this).setCurrent(gameCanvas);
参考