java - Brief : Some game objects move, 有些没有

标签 java inheritance aggregation

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

我得到了一个 MoveableObject 类(如下)。 Moveable GameObjects 在它们自己的构造函数中实例化此类。我没有得到保证这段代码是正确的,所以我试图掌握它背后的理论。

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。既然一个角色是一个可移动的对象,我不应该使用继承或接口(interface)吗?我也不明白为什么你需要创建一个 MoveableObject 的实例,如果每个角色要么是可移动的,要么是不可移动的,当然,你应该给他们移动或不移动的能力(通过继承或接口(interface))然后实例化角色?

提前致谢。

最佳答案

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

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

要进一步解释 MoveableObject 是否只是一个数据容器,您可以创建一个接口(interface):

public Interface Moveable {
   public MoveableObject getMovementData();
}

每个可移动类看起来像:

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

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

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
       }
}

关于java - Brief : Some game objects move, 有些没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19515628/

相关文章:

java - 为什么在HashMap中计算hashcode的索引

java - 如何使 JButton 在 Java 中不可点击?

java - XML读取不同段的相同标签

Java:使用以父类作为类型参数的构造函数

javascript - 在这种情况下在 JavaScript 中实现继承 [更具体地说是 node.js]

java - 如何在 Java Canvas 中绘制 JSON 文本?

c++选择函数的继承优先级

c++ - 使用 vector 聚合

elasticsearch - ElasticSearch对聚合进行过滤,而不会影响聚合计数

elasticsearch - 如何获取top_hits聚合中的字段