私はpaint()
そのようには使いません。 paint()
絵を描くためのものでなければなりません...描画します。ユーザー入力の監視とゲームロジックの処理をそのメソッドの外に分割します。
Canvas の GameCanvas サブクラスの使用を検討しましたか?
これにより、優れたダブルバッファリング機能が提供されます。別のスレッドを作成して、GameCanvas のrun()
メソッドを呼び出し、そこでユーザー入力をチェックし、ゲーム ロジックを更新してから、オフスクリーン バッファーに描画し、最後にオンスクリーン バッファーの再描画をトリガーします。
このようなもの:
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);
参考文献