我正在学习java,并尝试制作不同的功能和系统。现在我正在尝试制作一个非常简单的粒子系统,但我有问题。
public void eDelay()
{
try
{
Thread.sleep(17);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
public void engine()
{
int i = 0;
while (i < particles.size())
{
Particle a = (Particle) particles.get(i);
eDelay();
a.move();
i = i + 1;
}
}
public void actionPerformed(ActionEvent e)
{
engine();
repaint();
}
这是我的代码中粒子假设移动的一部分。它工作正常并且确实会移动,但是我希望它们一个接一个地移动一个延迟(17)。然而,他们一次又一次地移动而不是一个接一个地移动。 (particles)是一个包含50个元素的arrayList,每个元素包含一个粒子的位置。 (a.move())只是粒子向上移动的运动方法。
不要担心其余的代码,问题出在这一部分。
图形,粒子的定位,粒子的运动以及其他工作都很好。
答案 0 :(得分:1)
让我的评论回答:
“不要担心代码的其余部分,问题出在这一部分。 - 图形,粒子的定位,粒子的运动以及其他工作正常。”
当您知道问题的原因是什么时,您怎么能这样说?您可以创建一个Swing应用程序(这是其余代码的一部分)并在事件线程上调用Thread.sleep(...)
。所以不要做任何假设,告诉我们所有的故事,展示更相关的代码,让我们帮你解决这个问题。
编辑:我现在看到这实际上是一个Swing应用程序,所以这可能是你的问题,虽然你没有告诉我们调用Thread.sleep的位置。调用Thread.sleep(...)
会调用调用它的线程睡着了,如果这是Swing事件线程(或EDT),它会让你的整个应用程序都处于睡眠状态 - 这不是一件好事。因此,不要在事件线程上调用Thread.sleep
,而是使用Swing Timer。教程将向您展示如何。
当然,不要做任何假设。
答案 1 :(得分:1)
您应该在engine()
循环中调用重绘,而不是actionPerformed()
。
答案 2 :(得分:0)
好的,这实际上有点奇怪,但我只是将引擎类重写为for循环并且它可以工作。
public void engine()
{
goingcrazy = goingcrazy + gameTimer.getDelay();
for(int i = 0; i < particles.size(); i++)
{
if (goingcrazy > 1000*i)
{
Particle a = (Particle) particles.get(i);
a.move();
}
}
}
我已经发布了完整代码的链接,所以如果你感兴趣,你只需要用我刚发布的那个改变旧的引擎类。