2013-06-26 37 views
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)。然而,他们一举一动,而不是一个接一个。 (粒子)是一个arrayList,其中包含50个元素,每个元素包含一个粒子的位置。 (a.move())只是一个粒子向上移动的移动方法。

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

图形,颗粒的定位,颗粒的运动和其他事情都很好。

+2

'”不要担心代码的其余部分,问题出在这一部分 - 图形,颗粒的定位,颗粒的运动以及其他事情都可以正常工作。“ - 你怎么说当你知道你的问题的原因是什么?您可能正在创建一个Swing应用程序(它是其余代码的一部分)并在事件线程上调用'Thread.sleep(...)'。所以,不要做任何假设,告诉我们所有的故事,展示更多相关的代码,让我们来帮助你解决这个问题。如果这是Swing那么这就是你的问题 - 不要调用Thread.sleep,使用Swing Timer! –

+0

我对此有点困惑,我使用swing定时器作为游戏计时器,所以程序在一个连续的循环。两个计时器不会以奇怪的方式相互影响吗? – Mgssky

+0

@ user2522083:两个定时器应该运行得很好,但它们控制的代码是否会相互影响取决于你编写程序的方式。我认为我们不可能说。由于Swing代码都是单线程的,因此应该表现良好。 –

回答

1

打算让我的评论答案:

“别担心了代码的其余部分,问题是在这个部分 - 显卡,粒子的位置,粒子的运动, “

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

编辑:我现在看到,其实这是一个Swing应用程序,所以这可能是你的问题,虽然你不告诉我们在哪儿Thread.sleep代码被called.Calling Thread.sleep(...)把那个睡着调用它的线程,如果这是Swing事件线程(或EDT),它会让整个应用程序进入睡眠状态 - 这不是一件好事。所以不要在事件线程上调用Thread.sleep,而是使用Swing Timer。教程将告诉你如何。

当然,不要做任何假设。

+0

这是我的完整代码。它只包含3个类。 hostcode.sourceforge.net/view/882我完全没有想法。在我看来,我对阵列的工作原理有错误的理解。 – Mgssky

+0

好的,我有答案,将在六个小时左右发布(不允许)。 – Mgssky

1

您应该在engine()循环中调用repaint而不是actionPerformed()

+0

好抓,1+。当然,这将在Swing Timer中完成,而不是循环中。 –

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

    } 
} 

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