0
class MyCanvas extends Canvas{
    protected void paint(Graphics g) {
        //Process keyboard
        //Update movement/position
        //Draw
        repaint(); //loop
    } 
}

今まではゲーム ループに Canvas を使用していましたが、 ここpaint()で別のスレッドを使用する必要があるという Web の記事に出くわしました。
paint()

では、このまま続けていいのでしょうか?
それとも、そのために別のスレッドを作成する必要がありますか?

それぞれの長所と短所がわからないので、どの方法を選択すればよいかわかりませんが、方法を再描画することに慣れました

4

1 に答える 1

1

私は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);

参考文献

于 2013-03-14T04:04:27.360 に答える