0

我有一个线程正在尝试在 Java 中运行,用于我正在制作的游戏。线程基本上休眠了一会儿,更新对象,然后调用 repaint()。看起来它应该很好用,它看起来像我在互联网上找到的代码,但它不起作用。

代码在这里:

@Override
public void run() {
    int sleep = 500;
    Dimension dim = getSize();
    while(true){
        try {
            Thread.sleep(sleep);
            System.out.println("Sleeping!");
        } catch (InterruptedException e) {
            System.out.println("interrupted");
        }
        for(int i = 0 ; i < poop.size() ; i++){
            poop.get(i).update(dim.width, dim.height);
            System.out.println("Y is: "+poop.get(i).getYCoord()+" Step is: "+poop.get(i).getYStep());
        }
        repaint();
        }
}

当我将 try catch 块放入 for 循环时出现问题,调用正常,System.out 也打印 Y 坐标,但更新不再起作用。任何想法都会很棒。如果您需要更多代码,请告诉我,我也会将更新代码放在这里。也像对待线程的初学者一样对待我,因为我或多或少是我使用的摇摆库或多或少的初学者。

这是更新()代码:

@Override public void update(int screenWidth, int screenHeight)
{
    xCoord += xStep;
    if (xCoord > screenWidth) {
        xCoord = 0;
    } else if (xCoord < 0) {
        xCoord = screenWidth;
    }

    yCoord += yStep;
    if (yCoord > screenHeight) {
        yCoord = 0;
    } else if (yCoord < 0) {
        yCoord = screenHeight;
    }
}
4

3 回答 3

0

这里的问题是Dimension dim = getSize();由于某种原因将两者都设置为0。因此更新方法无法完成它的工作。

于 2012-12-03T06:06:57.573 回答
0

即使此代码在run()方法中并且可能在 Runnable 对象中,您的描述也是调用Thread.sleep(...)Swing 事件线程的症状。如果你这样做,你会让整个 GUI 进入睡眠状态,因为你正在睡眠的事件线程负责绘制 GUI 并与用户交互。

解决方案:不要那样做。执行任何长时间运行的任务或在后台线程中休眠,例如在 SwingWorker 中。

或者,摆脱您Thread.sleep(...)的 's 并使用 Swing Timer 代替。

于 2012-12-03T05:10:12.177 回答
0

repaint()在 for 循环完全完成之前,您不会调用。因此,将睡眠粘在里面不会导致它每 500 毫秒一次重新绘制一件东西。这将导致它只需要size() * 500通过循环,然后一次重绘所有内容。

于 2012-12-03T05:31:13.537 回答