GameObject在基于图块的游戏中存储自己的位置?

时间:2013-05-24 20:50:02

标签: map tile

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

  1. 对象不知道自己的位置。位置数据仅存储在地图中。如果我有位置,我可以立即找到一个对象。但是要从一个对象到另一个位置,我必须遍历一个数组。
  2. 对象知道它自己的位置。位置数据存储在Map和Object中。如果我有一个活动对象,我可以直接将该位置拉出对象。但这可能会导致地图数组与对象位置之间的不一致。我不确定在不改变另一个的情况下确保没有更新。我可以让每个控制器(对象和地图)都有一个移动对象的功能,当一个被调用时,它会查看另一个模型是否一致并更新它。然而,这似乎非常不优雅。

1 个答案:

答案 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];
    }
};