1

Swing を使用して Java で単純なボード ゲームを作成しています。AI は、ユーザーが自分の番になった後に順番が回るようになっています。ユーザーが自分の動きの結果を確認できるように、AI が順番を変える前にゲームを約 3 秒間「一時停止」したいと考えています。Thread.sleep(3000) を呼び出すと、Trident Animation Library を使用して作成したアニメーションも一時停止します。3 秒が経過すると、スペースは本来あるべき色に変わり、アニメーションはまったく実行されません。

誰かアドバイスを提供できる場合は、してください。AI が順番を変える前にユーザーが押すことができる「続行」ボタンをいつでも追加できることはわかっていますが、そのステップは避けたいと思います。

編集: これが私のシングル プレイヤー パネルです。これは、現在のボードに基づいて GUI を更新するメソッドを持つ単なる抽象クラスである GamePanel を拡張します。また、JPanel を拡張します。このクラスであろうと別のクラスであろうと、私がやりたいことをするためにタイマーをどこに/どのように実装するかについて、私は少し不明確だと思います。

4

2 に答える 2

4

Swing イベント スレッドまたは EDT を呼び出さないでくださいThread.sleep()。これにより、このスレッドが拘束され、Swing がグラフィックスを実行したり、ユーザーと対話したりできなくなります。代わりにスイングタイマーを使用してください。例えば、

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

Swing イベント ディスパッチ スレッドまたは EDT の詳細については、以下を参照してください: Swing での同時実行

于 2012-05-12T20:31:55.507 に答える
1

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

現在、AI に別のスレッドを使用しておらず、これが意図したより「単純」ではないように思え始めている場合は、 Futures と Callables の使用を検討してください完了。

于 2012-05-12T20:39:32.983 に答える