2

我正在从简报中构建一个基本游戏,并且已经获得了一些代码来查看。游戏中的所有角色都是游戏对象,有些是可移动的,有些则不是。可移动的有位置和方向。

我得到了一个 MoveableObject 类(如下)。可移动游戏对象在它们自己的构造函数中实例化这个类。我不能保证这段代码是正确的,所以我试图掌握它背后的理论。

public class MoveableObject {
    int speed;
    String direction;

    public MoveableObject(){
        speed = 0;
        direction = "unknown";
    }

    public MoveableObject(int iSpeed, String sDirection){
        speed = iSpeed;
        direction = sDirection;
    }

并且所有可移动角色在构造函数中创建此类的实例。例如,来自吸血鬼类。

public class Vampire
    public Vampire(){
            MoveableObject thisObject = new MoveableObject(30, "South-East");
        }
}

据我所知,这称为聚合。我认为这是用于 HAS-A 关系,而不是 IS-A。既然角色是可移动的对象,我不应该使用继承还是接口?我也不明白为什么你需要创建一个 MoveableObject 的实例,如果每个角色要么是可移动的,要么是不可移动的,当然,你应该赋予它们可移动或不可移动的能力(通过继承或接口)然后实例化性格?

提前致谢。

4

1 回答 1

0

这取决于MoveableObject该类是否还负责对象的实际移动(即根据speedanddirection成员更新其位置)或仅持有speedanddirection成员以便游戏的引擎模块将使用它来计算对象的位置。

在后一种情况下,我会将MoveableObject类的名称更改为更合适的名称并坚持聚合。否则继承将更适合可移动对象。这样,移动逻辑将被实现一次,子类只能满足自己的特定需求。

为了进一步解释如果MoveableObject它只是一个数据容器,您可以创建一个接口:

public Interface Moveable {
   public MoveableObject getMovementData();
}

每个可移动的类看起来像:

public class Vampire implements Moveable {
  .
  .
  private MoveableObject movementData; //
  .
  .
  public MoveableObject getMovementData() {
      return movementData;
  }
}

并在您的游戏引擎中保存所有移动对象的数组(可移动类型),并在更新方法中获取移动数据并对其进行处理:

public Class GameEngine {
   .
   .
   private ArrayList<Moveable> movableObjects = .....
   .
   .

   public void gameUpdate() {
       for (Moveable moveableObj : movableObjects) {
           MoveableObject movementData = moveableObj.getMovementData();
           // Process and update as required using the given data
       }
}
于 2013-10-22T10:54:09.380 回答