如何在使用过多的重绘时防止延迟

时间:2019-03-19 19:31:02

标签: java paint repaint

我正在尝试制作一个小游戏,一架飞机已经升起,当我单击向下箭头时,它会投下炸弹。如果炸弹击中了目标,它会改变位置等等。

public void paint(Graphics p) {
    p.setColor(c);
    p.drawLine(0, 650, 1000, 650);

    p.fillRect(x3, y3, 150, 50);
    p.fillOval(x2, y2, 30, 30);
    p.drawImage(image, x, y, null);

    if (x < 1000) {
        x = x + 10;
    }

    if (x > 750) {
        x = 0;
    }

    try {
        Thread.sleep(40);
    } catch (InterruptedException ignored) {
    }

    if (bo==true) {
        x2 = x2 + z;
        y2 = y2 + 8;
    }

    if (y2 > 450 && z != 0) {
        z--;
    }

    if (y2 > 620) {
        x2 =- 100;
        y2 =- 100;
    }

    if (y2 > 610 && x2 < x3 + 150 && x2 > x3) {
        x3 = x3 + 100;
    }

    repaint(1);
}

但是问题是起初在1或2秒fps之后一切正常,就像10,有时我看不到物体,我看到了另一个有关使用计时器的主题,但是我不想用计时器来解决它,甚至我也不知道如果我能。我想知道它是关于我的计算机还是ide。

1 个答案:

答案 0 :(得分:3)

首先,不要使用Override paint()方法。 Override paintComponent(Graphics g)方法(并且不要忘记调用super.paintComponent(g)

其次,在EDT中使用Thread.sleep()方法(希望您使用SwingUtilities#invokeLater启动应用程序)不是一个好主意,因为所有事件都将停止发生(只需几个单词,整个GUI就会冻结)。

您应该改为use a swing Timer

最后,请勿在{{1​​}}内调用repaint(),因为paintComponent将再次调用repaint(),这将是一个无休止的循环。您应该在Timer的动作监听器中重新绘制组件。