1

使用 MVC 设计模式制作基于图块的游戏。在我的地图模型中,我有一个包含所有游戏对象的二维数组,以便处理位置。但是我确实遇到过物体需要知道自己的位置的情况,例如法术的范围。对象也存储自己的位置是个好主意吗?我看到双方都有问题。

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

1 回答 1

0

我建议您将位置存储在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];
    }
};
于 2013-08-09T21:06:11.690 回答