使用MVC设计模式制作基于图块的游戏。在我的地图模型中,我有一个包含所有游戏对象的2D数组,因此处理位置。但是我确实有一个对象需要知道它自己的位置的情况,比如一个咒语的范围。对象也存储自己的位置是个好主意吗?我看到双方都有问题。
答案 0 :(得分:0)
我建议您将位置存储在GameObject
中,并使用私人字段和单个功能修改您的位置,以确保位置一致。该位置可以是GameObject的私有成员,2D数组应该是Map类的私有成员。然后在Map-class中定义一个允许移动对象的函数。此函数应更新数组以及存储在对象中的位置。如何授予Map类访问GameObject的位置取决于编程语言。在Java中你可以实现一个包私有函数(这是默认的访问级别)并在同一个类中定义Map和GameObject,在C#中你可以定义一个内部函数并在同一个程序集中定义Map和GameObject,在C ++中你可以让Map.move函数成为GameObject的朋友,授予它访问GameObject的受保护和私有成员的权限。
这种方法的唯一缺点是,您仍然可能会意外地修改GameObject在GameObject中的位置,而无需更新数组。如果要防止这种情况,可以将每个对象的位置存储在Map-class中的map / Dictionary中。在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];
}
};