我正在试着做一个小游戏,当我点击向下的箭头时,一架飞机就会掉下一颗炸弹。如果炸弹击中目标,它会改变位置,等等。
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。
发布于 2019-03-20 03:40:45
首先,不要Override
paint()
方法。Override
paintComponent(Graphics g)
方法(并且不要忘记调用super.paintComponent(g)
。
其次,在EDT中使用Thread.sleep()
方法(希望使用SwingUtilities#invokeLater
启动应用程序)不是一个好主意,因为所有事件都会停止发生(用很少的话,整个图形用户界面就会冻结)。
您应该改为使用use a swing Timer。
最后,不要在paintComponent
中调用repaint()
,因为repaint()
将再次调用paintComponent
,这将是一个无休止的循环。您应该在Timer`s的操作侦听器中重新绘制组件。
https://stackoverflow.com/questions/55248726
复制相似问题