0

我目前正在学习 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 个元素的数组列表,每个元素包含一个粒子的位置。(a.move()) 只是粒子向上移动的一种移动方法。

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

图形、粒子的定位、粒子的运动和其他东西都可以正常工作。

4

3 回答 3

1

您应该在循环中调用 repaintengine()而不是actionPerformed().

于 2013-06-26T00:31:37.327 回答
1

打算让我的评论成为答案:

“别担心其余的代码,问题出在这部分。 - 图形、粒子的定位、粒子的移动和其他东西都可以正常工作。”`

当您知道问题的原因是什么时,您怎么能这么说?您可以创建一个 Swing 应用程序(它是其余代码的一部分)并调用Thread.sleep(...)事件线程。所以不要做任何假设,告诉我们所有的故事,展示更多相关的代码,让我们帮你解决这个问题。

编辑:我现在看到这实际上是一个 Swing 应用程序,所以这很可能是你的问题,尽管你没有告诉我们 Thread.sleep 被调用的位置。CallingThread.sleep(...)使调用它的线程进入睡眠状态,如果这是 Swing事件线程(或 EDT),它会让你的整个应用程序进入睡眠状态——这不是一件好事。所以不要调用Thread.sleep事件线程,而是使用 Swing Timer。教程将向您展示如何操作。

当然,再一次,不要做任何假设。

于 2013-06-26T00:05:39.320 回答
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();
        }

    }
}

我已经发布了完整代码的链接,因此如果您有兴趣,只需将旧引擎类更改为我刚刚发布的引擎类。

于 2013-06-26T10:51:49.187 回答