1

MVC デザイン パターンを使用してタイル ベースのゲームを作成します。私のマップ モデルには、すべてのゲーム オブジェクトの 2D 配列があり、それが位置を処理します。しかし、呪文の範囲など、オブジェクトが自身の位置を知る必要がある場合もあります。オブジェクトが独自の場所も保存することは良い考えですか? 双方に問題があると思います。

  1. オブジェクトは自身の位置を知りません。位置データは地図にのみ保存されます。場所があれば、すぐにオブジェクトを見つけることができます。しかし、オブジェクトから場所に移動するには、配列を反復処理する必要があります。
  2. オブジェクトは自分の位置を知っています。Map と Object に格納された位置データ。アクティブなオブジェクトがある場合は、オブジェクトから場所を引き出すことができます。ただし、これにより、マップ配列とオブジェクトの位置が一致しなくなる可能性があります。もう一方を変更せずに一方が更新されていないことを確認することはできません。各コントローラー (オブジェクトとマップ) にオブジェクトを移動する関数を持たせ、一方が呼び出されると、もう一方のモデルが一貫しているかどうかを確認して更新することができます。ただし、これは非常にエレガントではないようです。
4

1 に答える 1

0

に場所を保存することをお勧めしますGameObjectプライベート フィールドと単一の関数を使用して場所を変更することで、場所が一貫していることを確認します。場所は GameObject のプライベート メンバーにすることができ、2D 配列は Map クラスのプライベート メンバーにする必要があります。次に、オブジェクトを移動できる Map クラスの関数を定義します。この関数は、配列とオブジェクトに格納されている場所を更新する必要があります。Map クラスに GameObject の場所へのアクセスを許可する方法は、プログラミング言語によって異なります。Java では、package-private 関数 (これがデフォルトのアクセス レベルです) を実装し、同じクラスで Map と GameObject を定義できます。C# では、内部関数を定義して、同じアセンブリで Map と GameObject を定義できます。C++ ではMap.move 関数をゲームオブジェクトのフレンドにすることができます。

このアプローチの唯一の欠点は、配列を更新せずに、GameObject 自体内の GameObject の位置を誤って変更する可能性があることです。これを防ぎたい場合は、各オブジェクトの場所を Map クラスのマップ/辞書に保存できます。C++ では、これは大まかに次のようになります。

#include<map>

class GameObject {}; //don't store the location here

struct Location {
    int x,y;
};

class Map {
private:
    //the 2D array containing pointers to the GameObjects
    GameObject* array[WIDTH][HEIGHT];

    //a map containing the locations of all the GameObjects, indexed by a pointer to them.
    std::map<GameObject*,Location> locations;

public:
    //move an object from a given location to another
    void move( int fromX, int fromY, int toX, int toY ) {
        GameObject* obj = array[fromX][fromY;
        array[toX][toY] = obj
        array[fromX][fromY] = 0;
        locations[obj].x = toX;
        locations[obj].y = toY;
    }

    //move a given object to a location
    void move( GameObject* obj, int toX, int toY ) {
        Location loc = locations[obj];
        move( loc.x, loc.y, toX, toY );
    }

    //get the location of a given object
    Location getLocation( GameObject* obj ) const {
        return locations[obj];
    }
};
于 2013-08-09T21:06:11.690 に答える