5

私はそのような配列リストを持っています:

private List<GameObject> gameObjects = new CopyOnWriteArrayList<GameObject>();

GameObject、、およびの3つのクラスのいずれかにSpaceshipなりBeamますAsteroid。それらはすべて類似しているので、私はそれらを1つの配列に保持します。ただし、宇宙船には、他のスレッド(と呼ばれるShootRunnable)で100msごとに使用される追加メソッドシュートがあります。Spaceshipですから、他の人は狙い撃ち法を実装していないので、それを繰り返したいと思います。これを達成するための最良の方法は何ですか?

for (GameObject ob : gameObjects) {
  if (ob instanceof Spaceship) {
    ob.shoot();
  }
}

上記のようなものを使用してそれを繰り返すことはできますか?キャストか何かを使って?助けてください。

4

5 に答える 5

2

あなたのゲームで、定期的に発生する他のアクションはありますか?

その場合、shoot()メソッドを抽象メソッド ( という名前にすることができますperiodicAction()) に変更して、GameObjectクラスに配置できます。クラスはこのSpaceshipメソッドを射撃によって実装し、他のクラスは特定の定期的な動作を実行し、Asteroidクラスは何も実行しません。

于 2013-01-20T18:37:15.197 に答える
2

あなたがたどっている道は技術的に実現可能ですが、経験則としては、リフレクションを使い始めると、おそらく何か間違ったことをしているでしょう。この場合、2 つのコレクションを用意するのが賢明かもしれません。1 つはすべてのゲーム タイプ用で、もう 1 つは宇宙船専用です。

于 2013-01-20T18:22:48.650 に答える
0

アスタリスクやビームがこのメソッドを使用しないため、shoot()メソッドをSpaceshipクラスに配置する必要があります。これを行うには、少なくとも2つのコレクションも保持する必要があります。それらの1つには、宇宙船のみが含まれている必要があります。

于 2013-01-20T18:27:06.353 に答える
0

インターフェイスActionまたはメソッドをGameObject次のように作成できます。

public interface Action {
   void performAction();
}

public abstract class GameObject implements Action {
   //...
   public void performAction() {
      // subclasses should override this method.
      // otherwise, it will do nothing.
   }
}

そして、実装しますSpaceship

public class Spaceship extends GameObject {
    @Override
    public void performAction() {
        this.shoot();
    }
}

BeamとにAsteroid、メソッドを残すことができますperformAction:

次に、次の操作を行うことができます。

for (GameObject ob : gameObjects) {
  ob.performAction();
}
于 2013-01-20T19:14:01.830 に答える
0

私はむしろこのようにしたい:

 Iterator<Spaceship> getSpaceships(){
     // return Iterator over Spaceship objects through use of instanceof
 }

 ...
 Iterator<Spaceship> it = getSpaceships()
 while(iter.hasNext()) it.next().shoot()

私には、より明確に見えます。

于 2013-01-20T18:45:05.557 に答える