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

Java me 使用repaint()作为游戏循环是个好主意吗?,java-me,repaint,Java Me,Repaint,直到现在,我还在游戏循环中使用Canvas的paint(),但我在网上看到一篇文章说这里应该使用另一个线程 现在我想知道paint()是否是处理所有数据的好/安全的地方 那么我可以继续这样做吗? 或者我应该为此制作另一个线程吗? 我不确定每种方法的优点和优点,所以我不确定该选择哪种方法,但我习惯了重新绘制方法,我不会使用paint(),那样的话,不。paint()应该用于绘制。。。绘画我会将你对用户输入的监控和游戏逻辑处理分离到这个方法之外 你有没有考虑过使用这个软件 它提供了一些不错的双缓冲功

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

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


我不确定每种方法的优点和优点,所以我不确定该选择哪种方法,但我习惯了重新绘制方法,我不会使用
paint()
,那样的话,不。
paint()
应该用于绘制。。。绘画我会将你对用户输入的监控和游戏逻辑处理分离到这个方法之外

你有没有考虑过使用这个软件

它提供了一些不错的双缓冲功能。您将创建另一个线程,它将调用GameCanvas的“
run()
方法,在该方法中,它将检查用户输入,更新游戏逻辑,然后绘制屏幕外缓冲区,最后触发屏幕上缓冲区的重新绘制

大概是这样的:

class MyCanvas extends Canvas{
    protected void paint(Graphics g) {
        //Process keyboard
        //Update movement/position
        //Draw
        repaint(); //loop
    } 
}
请注意,为了简洁起见,我基本上将所有内容都放在
run()
方法中。我假设你的游戏更复杂,并且需要分离不同的方法来获取用户输入,更新逻辑,然后调用图形/绘画方法。这些都将从
run()
调用

用法 在MIDlet中开始此操作,让我们使用
startApp()
方法:

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();
          }
       }
    }
}
工具书类
  • ,如果您不使用
    GameCanvas
    ,只需使用
    Canvas
  • ,具有代码和一般理论
  MyGameCanvas gameCanvas = new MyGameCanvas();
  gameCanvas.start();
  exitCommand = new Command("Exit", Command.EXIT, 1);
  gameCanvas.addCommand(exitCommand);
  gameCanvas.setCommandListener(this);
  Display.getDisplay(this).setCurrent(gameCanvas);