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)で次々と移動したいです。ただし、それらは次々と移動するのではなく、一度に移動します。(粒子) は 50 個の要素を持つ arrayList であり、各要素には粒子の位置が含まれています。(a.move()) は、パーティクルが上に移動する単なる移動メソッドです。

コードの残りの部分については心配しないでください。問題はこの部分にあります。

グラフィックス、粒子の配置、粒子の動き、その他は正常に動作します。

4

3 に答える 3

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 に答える