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");
        }
}

私の知る限り、これは集約として知られています。これは、IS-A 関係ではなく、HAS-A 関係で使用されるものだと思いました。キャラクターは可動オブジェクトなので、継承やインターフェイスを使用しないでください。また、MoveableObject のインスタンスを作成する必要がある理由もわかりません。各キャラクターが移動可能かどうかに関係なく、(継承またはインターフェイスを介して) 移動可能かどうかを指定してからインスタンス化する必要があります。キャラクター?

前もって感謝します。

4

1 に答える 1

0

これは、クラスがオブジェクトの実際の動きも処理する (つまり、 andメンバーMoveableObjectに従ってその位置を更新する) か、ゲームのエンジン モジュールがそれを使用してオブジェクトの位置を計算するようにandメンバーを保持するだけかによって異なります。speeddirectionspeeddirection

後者の場合、MoveableObjectクラスの名前をより適切なものに変更し、集約に固執します。それ以外の場合、継承は可動オブジェクトにより適しています。そうすれば、移動ロジックが一度実装され、サブクラスは独自の特定のニーズにのみ対応できます。

が単なるデータ コンテナであるかどうかをさらに説明するにMoveableObjectは、インターフェイスを作成できます。

public Interface Moveable {
   public MoveableObject getMovementData();
}

各可動クラスは次のようになります。

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

ゲームエンジンではすべての移動オブジェクトの配列を保持し (Type moveable)、update メソッドで移動データを取得して処理します。

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 に答える