5

我有一个这样的数组列表:

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

GameObject可以是 3 个类之一SpaceshipBeamAsteroid。它们都很相似,所以我将它们放在一个数组中。然而,宇宙飞船有附加方法 shoot ,它在其他线程(称为ShootRunnable)中每 100 毫秒使用一次。所以我只想迭代它,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

你所走的道路在技术上是可行的,但一个好的经验法则是,如果你开始使用反射,你可能做错了什么。在这种情况下,拥有两个集合可能是最明智的,一个用于所有游戏类型,一个专门用于宇宙飞船。

于 2013-01-20T18:22:48.650 回答
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 回答
0

你应该把你的 shoot() 方法放到 Spaceship 类中,因为没有 asteriod 或 beam 会使用这个方法。完成此操作后,您还应该至少保留两个集合。其中一个应该只包含你的宇宙飞船。

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

Beamand Asteroid,你可以离开方法performAction

然后,您可以交互:

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