我一直致力于用 C++ 创建游戏。 World
类包含所有游戏状态相关对象和主要游戏循环函数。
class World {
Clock clock;
Map map;
std::vector<Entity*> entities;
...
我游戏中的所有实体都继承自抽象类 Entity
。例如:
class Player: public Entity {...};
class Enemy: public Entity {...};
class Bullet: public Entity {...};
通过遍历所有实体的列表并在每个实体上调用 update()
方法,每一帧更新实体。
为了考虑不同的帧速率,我将每帧中耗时作为 float delta
传递给更新方法(与大多数其他游戏引擎一样)。我遇到的问题是一个实体可能需要在 update()
中引用所有不同的东西。
Entity
类定义虚拟更新方法如下:
virtual void update(float delta) = 0;
从游戏循环中调用此函数如下所示:
for(int i = 0; i < entities.size(); i++) {
entities[i]->update(clock.get_delta());
}
这很好用。但是现在,假设我们想要添加一项功能,让 Player
可以在不同的表面上更快地移动。要知道玩家所在的表面需要访问属于 World
类的 Map
对象。
我们可以将其添加到虚拟更新方法中:
virtual void update(float delta, Map *map) = 0;
但现在 Enemy
和 Bullet
的更新函数必须采用新的 map 参数,即使它们没有使用它。
实体在其更新方法中需要的任何其他对象或变量也是如此。不久之后,方法定义中就会出现数十个参数(游戏 map 、其他实体列表、游戏状态信息)。
我的问题是:如何防止这种情况发生?我尝试将对 World
的引用作为唯一参数传递,但它导致了循环依赖。
最佳答案
我在我的游戏中通过在 Player
类中存储一个 Map*
解决了这个问题。如果您永远不必更改它,效果很好。
关于c++ - 游戏模式中更新方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42638023/