【问题标题】:GameObject store its own location in a tile based game?GameObject 在基于图块的游戏中存储自己的位置?
【发布时间】:2013-05-24 20:50:02
【问题描述】:

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

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

【问题讨论】:

    标签: map tile


    【解决方案1】:

    我建议您将位置存储在 GameObject 中,并通过使用私有字段和单个函数来修改您的位置来确保位置一致。位置可以是 GameObject 的私有成员,二维数组应该是 Map 类的私有成员。然后你在 Map 类中定义一个函数,它允许你移动对象。这个函数应该更新数组以及存储在对象中的位置。如何授予 Map 类对 GameObject 位置的访问权限取决于编程语言。在 Java 中,您可以实现一个包私有函数(这是默认访问级别)并在同一个类中定义 Map 和 GameObject,在 C# 中,您可以在 C++ 中定义一个内部函数并在同一个程序集中定义 Map 和 GameObject您可以让 Map.move 函数成为 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];
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多