首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Paint方法的Java小程序故障

使用Paint方法的Java小程序故障
EN

Stack Overflow用户
提问于 2012-08-23 11:10:55
回答 2查看 756关注 0票数 0

到目前为止,我已经让这个applet进入了工作阶段;唯一的问题是,它只有在鼠标移动的情况下才能工作;如果鼠标没有移动,那么整个过程就会停止。如果移动鼠标,它将重新开始工作。

它的工作方式是paint方法由mouseMoved方法调用。每次移动鼠标时,它都会抛出paint方法,然后游戏继续。问题产生于mouseMoved方法没有被调用,因此paint方法没有被调用,整个过程只是暂停,直到鼠标移动。

我尝试过以下几种方法:

让paint方法是递归的,这样它就会调用自己。这样做的问题是,鼠标监听器无法工作,因为程序忙于绘制一堆移动的东西。

我还尝试使用线程,这样鼠标监听器就会中断paint方法。这没有起作用,尽管这可能是因为我不理解线程是如何工作的。如果有人知道如何实现这一点,它似乎会工作。

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

代码语言:javascript
复制
  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);
  }  
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-23 11:17:51

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

代码语言:javascript
复制
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);
}  

不过,你需要调整一下时间

票数 1
EN

Stack Overflow用户

发布于 2012-08-23 11:29:57

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

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

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

Best way to implement game loop without freezing UI thread

game loop - threads

祝好运!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12084222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档