2012-05-12 7 views
1

私はSwingをAIで使用して簡単なボードゲームを作成しています。私は約3秒間ゲームを「一時停止」してから、AIが自分の移動の結果を見ることができるように順番を変えるようにします。 Thread.sleep(3000)を呼び出すと、Trident Animation Libraryを使用して作成したアニメーションも一時停止します。 3秒の終わりになると、スペースはただの色に変わり、アニメーションは全く行われません。Java Trident LibraryとThread.sleep()

誰でもアドバイスを提供できるのであれば、どうぞ。私はAIがターンを取る前にユーザーがいつでも押すことができる "Continue"ボタンをいつも追加することができますが、そのステップを避けたいと思います。

編集:ここに私のシングルプレイヤーパネルがあります。これは、現在のボードに基づいてGUIを更新するメソッドを持つ抽象クラスであるGamePanelを拡張します。 JPanelも拡張されています。私は、このクラスかどうかに関わらず、自分がやりたいことをやるためにタイマーを実装する場所/方法について少しはっきりしていないと思います。

答えて

1

あなたはとにかく別のスレッドでAIのコードを実行していると仮定すると、(あなたがロックアップしたいとは思わないでしょうその複雑なAI機能を実行している間はUIですか?)、UIスレッドではなくAIスレッドで一時停止が発生します。そこにThread.sleep()を追加してください。

AIのための別のスレッドを現在使用していない場合は、意図したよりも「シンプル」ではないと聞き始めます。Futures and Callablesを使用してください。バックグラウンド操作と連鎖するイベント彼らが完了するとき。

+1

さらに良い答えです。 1 + –

+0

なぜ、ありがとう:) –

+0

私もこのソリューションを試して、私のPlayerクラスでRunnableを実装し、run()をオーバーライドしました。私は、私のComputerPlayerクラス内からThread.sleep()を呼び出しましたが、アニメーションはまだ一時停止していて、色が変わります。私は正確に何が間違っているのか分かりません。コードを1分で更新します。 – Cuthbert

4

スウィングイベントスレッドまたはEDTには決して電話をかけないでください。スウィングがこのグラフィックスをやりとりしたり、ユーザーとやりとりするのを妨げたりします。代わりにSwing Timerを使用してください。例えば、SwingのイベントディスパッチスレッドまたはEDTの詳細について

int delay = 3000; 
    new Timer(delay , new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // tell AI to do its thing 
     ((Timer)e.getSource()).stop(); 
    } 
    }).start(); 

は、読んでください:Concurrency in Swing

+0

オリジナルの投稿をいくつかのコードで更新しました。私は、タイマーを追加する場所/方法はちょっと分かりません。 – Cuthbert

+0

@ d2jxp:冗談ではありませんが、遅れたい場所に追加してください。実験。 –

+0

Not-trite :-P私はそれをうんざりしています.AIが動く前に、アニメーションを再生して終了するようには思えません。それで全部です。 – Cuthbert

関連する問題