使用repaint()作为游戏循环是一个好主意吗?

时间:2013-03-13 19:13:47

标签: java-me repaint

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

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

我可以继续这样做吗? 或者我应该为此制作另一个帖子?

我不确定每个的优点和视锥细胞因此我不确定选择哪种方法但我习惯重新绘制方法

1 个答案:

答案 0 :(得分:1)

我不会那样使用paint(),不。 paint()应该用于绘画......绘画。我会在该方法之外拆分用户输入和游戏逻辑处理的监控。

您是否考虑过使用GameCanvas subclass of Canvas

它为您提供了一些不错的双缓冲功能。您将创建另一个线程,它将调用您的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);

参考