粒子系统,阵列中的延迟

时间:2013-06-26 00:00:36

标签: java

我正在学习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())只是粒子向上移动的运动方法。

不要担心其余的代码,问题出在这一部分。

图形,粒子的定位,粒子的运动以及其他工作都很好。

3 个答案:

答案 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();
        }

    }
}

我已经发布了完整代码的链接,所以如果你感兴趣,你只需要用我刚发布的那个改变旧的引擎类。