我一直在努力用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
可以在不同的表面上移动得更快。要了解播放器所处的表面,需要访问属于Map
类的World
对象。
我们可以将其添加到虚拟更新方法中:
virtual void update(float delta, Map *map) = 0;
但是现在Enemy
和Bullet
的更新函数必须采用新的map参数,即使它们不使用它。
实体在其更新方法中需要的任何其他对象或变量也是如此。不久之后,会有很多参数(游戏地图,其他实体列表,游戏状态信息)混乱方法定义。
我的问题是:如何防止这种情况发生?我尝试将对World
的引用作为唯一参数传递,但它导致了循环依赖。
答案 0 :(得分:1)
我在游戏中通过在Map*
课程中存储Player
来解决这个问题。如果你永远不需要改变它,那就太棒了。