に場所を保存することをお勧めします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];
}
};