0

タイルを含むボードがあり、タイルには障害物が含まれています。障害物は、いくつかのタイプ (壁、レーザーなど) のいずれかです。

ゲームのすべてのラウンドで、すべての障害物を実行するボードを実行します。障害物が実行され、何かが変更されると、GUI に通知され、影響を受けたタイルが更新されます。

GUI では、タイルはオーバーラップ イメージ (JLabels) を含む OverLayLayout であるため、オーバーラップ イメージはすべて表示されます。

問題は、それらを実行すると高速になり、何も起こらないことです。たとえば、レーザー ビームが表示されない場合、プレーヤーが損傷することはありますが、実際に発生することはありません...

そこで、ユーザーが GUI の更新を確認できるように、ゲームをたとえば 500 ミリ秒待機させようとしました。試してみました (ただし、間違っている可能性があります): タイマー、swingtimers、countdownlatch などですが、うまく動作しないようです。これを修正する方法についてのアイデアはありますか? それとも、待機の代わりになるのでしょうか?

前もって感謝します!

更新: ボードでの実行は次のようになります。

Iterator<Obstacle> it = obstacles.iterator();
while (it.hasNext())
    it.next().execute(this);

CountDownLatch countDown = new CountDownLatch(1);
setChanged();
notifyObservers(countDown);
countDown.await();

(通知される) GUI ボードの更新機能は次のようになります。

final CountDownLatch countDown = (CountDownLatch) arg;
SwingUtilities.invokeLater(new Runnable(){
   public void run() {
      try {
        updateUI();
        wait(500);
      } catch (InterruptedException ex) { }
            countDown.countDown();
   }
});
4

1 に答える 1

4

コードを見なければ、問題を特定するのは困難です。イベント ディスパッチ スレッドをブロックしていると思われます。

このタイルベースのゲームは、 のインスタンスを使用してjavax.swing.Timerプレイをアニメーション化します。を押しAてアニメーションを有効にし、空いている四角をクリックして効果を確認します。あなたのゲームにアプローチを適応させることができるかもしれません。

于 2012-05-23T19:15:41.930 に答える