使用Paint方法的Java Applet故障

时间:2012-08-23 03:10:55

标签: java methods applet paint

到目前为止,我已将此applet推向了工作阶段;唯一的问题是它只有在鼠标移动时才有效;如果没有移动鼠标,那么整个事情就会停止。如果移动鼠标,它将再次开始工作。

它的工作方式是使用mouseMoved方法调用paint方法。每次移动鼠标时,都会抛出绘制方法,游戏继续进行。问题出现在没有调用mouseMoved方法时,因此不会调用paint方法,整个过程只会暂停,直到移动鼠标。

我尝试了以下内容:

使paint方法具有递归性,因此它会调用自身。这个问题是,然后mouselistener不起作用,因为程序是忙着画一堆东西四处移动。

我也尝试使用线程,以便mouselistener会中断paint方法。这不起作用,虽然这可能是因为我不明白线程是如何工作的。如果有人知道如何实现这一点,它似乎会起作用。

以下是问题区域的代码片段;

  public void paint( Graphics gr) {
     if( Earth != null){

        displayWorld(Earth);
        for(int a =0; a < 100; a++){      
           Earth.run();
           Earth.Worlds.get(2).forceMove(x,y);
          }
        try
        {
           Thread.sleep(100);  
        }
           catch (InterruptedException ie)
           {}   
     }

  }

public void mouseMoved( MouseEvent e ) {
     x = e.getX();
     y = e.getY();
     Graphics gr = getGraphics();      
    paint(gr);
  }  

2 个答案:

答案 0 :(得分:2)

我建议再看一下线程。这是游戏编程中的一个非常标准的问题(在其他编程领域) - 你有一个线程,永远循环,包含你的游戏逻辑。如果没有工作要做,它会更新你的玩家的位置,计算,健康状况,等等。如果完成了需要重绘applet图形的工作,那么你的线程会调用repaint(),它会向事件调度线程(在每个Java程序中自动创建的特殊线程)发送重绘请求。

当玩家移动鼠标或提供键盘输入时,您的事件监听器会更新程序的数据结构(并在主线程处于休眠状态时调用主线程)。

这些指向以前涉及Java游戏的StackOverflow问题的链接可能是一个很好的起点:

Best way to implement game loop without freezing UI thread

game loop - threads

祝你好运!

答案 1 :(得分:1)

那么,你的绘画过程依赖鼠标移动?所以你需要某种方式告诉applet更新自己??

private javax.swing.Timer paintTimer;

public void start() {
    // Your normal setup...

    paintTimer = new javax.swing.Timer(250, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            Graphics gr = getGraphics();      
            paint(gr);
        }
    });
    paintTimer.setRepeats(true);
    paintTimer.setCoalesce(true);
    paintTimer.start();
}

public void mouseMoved( MouseEvent e ) {
    x = e.getX();
    y = e.getY();

    // You could wait for the timer to trigger the repaint for you...
    repaintTimer.restart();

    Graphics gr = getGraphics();      
    paint(gr);
}  

你需要玩这个时间