0

2 つの移動オブジェクトを持つプログラム (AWT フレーム、はい、Swing の方が優れていることはわかっていますが、使用が制限されています) があります。そのため、オブジェクトを異なる速度で移動できるようにするために、それぞれを独自のスレッドに入れることを考えました。

1 つのスレッド ( gameThread) は弾むボールを処理し、もう 1 つのスレッド ( )cannonThreadは画面に描かれた大砲とそれによって発射される発射物を処理します。ボールの速度と発射体の速度を分離する方法がわからなかったため、2 つのスレッドが機能すると考えました ( を使用thread.sleep(speedofobject))。

それらを実装する方法がわからず、私のランダムな推測 (明らかに) は機能しませんでした。画面には何も表示されず、コンパイル時にエラーは生成されません。以前は、ボールが画面に表示され、必要に応じて動き回っていました。

これは、複数のスレッドを実行しようとした場所のスニペットです。さらに情報が必要な場合はお知らせください。投稿します。

public void start()
{
    if (gameThread == null)
    {
        gameThread = new Thread(this);
        gameThread.start();
    }
    if (cannonThread == null)
    {
        cannonThread = new Thread(this);
        cannonThread.start();
    }       
}

public void run()
    {
        //thread for the ball, collision detection and scorekeeping
        if (Thread.currentThread().equals(gameThread))
        {
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
            while (!kill)
            {
                if (!paused)
                {
                    target.repaint();
                }
                try
                {
                    Thread.sleep(ballSpeed);
                }
                catch(InterruptedException e){System.err.println("Interrupted.");}
            }
            stop(); 
        }

        //thread for the cannon and projectile
        if (Thread.currentThread().equals(cannonThread))
        {
            Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
            if (!paused)
            {
                if (projectileFiring)
                {
                    cannon.repaint();
                }
                try
                {
                    Thread.sleep(projectileSpeed);
                }
                catch(InterruptedException e){System.err.println("Interrupted.");}
            }
        }   
    }
4

1 に答える 1

0

ワールド内のオブジェクトごとに個別のスレッドを持つことは、適切な方法ではありません。これに対処する 1 つの方法は、「ワールド モデル」(あなたの場合はボールと大砲) の更新を担当する単一の個別のスレッドを用意することです。このワールド モデル スレッドは、次のアニメーション ループを実行します。

  1. 短時間寝る
  2. 現在の時間に基づいてボールと大砲を表すデータを更新します
  3. 現在のモデルで UI を更新する必要があることを知らせます

このアプローチでは、モデル データへのアクセスを同期する必要があることに注意してください。これは、モデル データが 1 つのスレッドのアニメーション ループによって更新され、レンダリング コードによって読み取られて UI が更新されるためです。読み取り中にデータを変更したくない場合。

于 2012-11-18T21:36:49.027 に答える