游戏对象应该如何相互了解?
我发现很难找到一种组织游戏对象的方法,以使它们是多态的,但同时又不是多态的。 这是一个示例:假设我们希望所有对象都到update()和draw()。为此,我们需要定义一个GameObject具有这两个虚拟纯方法的基类,并让多态性起作用: class World { private: std::vector<GameObject*> objects; public: // ... update() { for (auto& o : objects) o->update(); for (auto& o : objects) o->draw(window); } }; 应该使用update方法来处理特定类对象需要更新的任何状态。事实是每个对象都需要了解周围的世界。例如: 地雷需要知道是否有人与它发生碰撞 士兵应知道另一支队伍的士兵是否在附近 僵尸应该知道半径内最近的大脑在哪里 对于被动交互(如第一个交互),我认为碰撞检测可以使用来将在特定情况下发生碰撞的操作委托给对象本身on_collide(GameObject*)。 其他大多数信息(如其他两个示例)都可以通过传递给该update方法的游戏世界来查询。现在,世界不再根据对象的类型来区分对象(它将所有对象存储在一个多态容器中),因此理想world.entities_in(center, radius)情况下返回的是的容器GameObject*。但是,当然,该士兵不希望攻击其团队中的其他士兵,而僵尸也不会处理其他僵尸。因此,我们需要区分行为。解决方案可能是以下几种: void TeamASoldier::update(const World& world) { auto list = world.entities_in(position, eye_sight); for (const auto& e : list) …