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

到目前为止,我使用 Canvas 的paint()游戏循环,但我在网上看到一些文章说应该在这里使用另一个线程
现在我想知道是否paint()是处理所有数据的好/安全的地方。

那么我可以继续这样做吗?
或者我应该为此制作另一个线程吗?

我不确定每种方法的优缺点,所以我不确定选择哪种方法,但我习惯了重新绘制方法

4

1 回答 1

1

我不会用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);

参考

于 2013-03-14T04:04:27.360 回答