我建议您将位置存储在GameObject
并通过使用私有字段和单个函数来修改您的位置来确保位置是一致的。位置可以是 GameObject 的私有成员,二维数组应该是 Map 类的私有成员。然后你在 Map 类中定义一个函数,它允许你移动对象。这个函数应该更新数组以及存储在对象中的位置。如何授予 Map 类对 GameObject 位置的访问权限取决于编程语言。在 Java 中,您可以实现一个包私有函数(这是默认访问级别)并在同一个类中定义 Map 和 GameObject,在 C# 中,您可以在 C++ 中定义一个内部函数并在同一个程序集中定义 Map 和 GameObject你可以让 Map.move 函数成为 GameObject 的朋友,
这种方法的唯一缺点是,您仍然可能在不更新数组的情况下意外修改 GameObject 在 GameObject 本身内的位置。如果您想防止这种情况发生,您可以将每个对象的位置存储在地图类的地图/字典中。在 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];
}
};