Map 游戏对象在基于平铺的游戏中存储自己的位置?

Map 游戏对象在基于平铺的游戏中存储自己的位置?,map,tile,Map,Tile,使用MVC设计模式制作一个基于瓷砖的游戏。在我的地图模型中,我有一个包含所有游戏对象的2D数组,以便处理位置问题。但我确实有这样的情况,当一个物体需要知道它自己的位置,比如咒语的范围。对象也存储自己的位置是一个好主意吗?我认为双方都有问题 对象不知道自己的位置。位置数据仅存储在地图中。如果我有一个位置,我可以立即找到一个对象。但要从一个对象转到另一个位置,我必须遍历一个数组。 对象知道它自己的位置。位置数据存储在地图和对象中。如果我有一个活动对象,我可以直接从对象中拉出该位置。但这可能会导致贴图

使用MVC设计模式制作一个基于瓷砖的游戏。在我的地图模型中,我有一个包含所有游戏对象的2D数组,以便处理位置问题。但我确实有这样的情况,当一个物体需要知道它自己的位置,比如咒语的范围。对象也存储自己的位置是一个好主意吗?我认为双方都有问题

对象不知道自己的位置。位置数据仅存储在地图中。如果我有一个位置,我可以立即找到一个对象。但要从一个对象转到另一个位置,我必须遍历一个数组。 对象知道它自己的位置。位置数据存储在地图和对象中。如果我有一个活动对象,我可以直接从对象中拉出该位置。但这可能会导致贴图数组和对象位置之间的不一致。我不确定在不更改另一个的情况下是否更新了其中一个。我可以让每个控制器对象和贴图都有一个移动对象的函数,当一个被调用时,它会查看另一个的模型是否一致并更新它。然而,这似乎极不雅观。
我建议您将位置存储在GameObject中,并通过使用私有字段和单个函数修改位置来确保位置一致。位置可以是游戏对象的私有成员,2D数组应该是Map类的私有成员。然后在Map类中定义一个函数,用于移动对象。此函数应更新数组以及存储在对象中的位置。如何授予地图类访问游戏对象位置的权限取决于编程语言。在java中,你可以实现一个包私有函数,这是默认的访问级别,在同一个类中定义映射和GAMEObjor,在C中,你可以定义一个内部函数,并在同一个程序集中定义地图和游戏对象,C++中你可以把MaP.Moad函数作为游戏对象的朋友,授予它对游戏对象的受保护和私有成员的访问权

这种方法唯一的缺点是,你仍然可以在不更新阵列的情况下,意外地修改游戏对象在游戏对象本身中的位置。如果要防止出现这种情况,可以将每个对象的位置存储在map类的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];
    }
};