游戏模式中更新方法的参数

时间:2017-03-07 00:22:21

标签: c++ inheritance design-patterns game-engine

我一直在努力用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;

但是现在EnemyBullet的更新函数必须采用新的map参数,即使它们不使用它。

实体在其更新方法中需要的任何其他对象或变量也是如此。不久之后,会有很多参数(游戏地图,其他实体列表,游戏状态信息)混乱方法定义。

我的问题是:如何防止这种情况发生?我尝试将对World的引用作为唯一参数传递,但它导致了循环依赖。

1 个答案:

答案 0 :(得分:1)

我在游戏中通过在Map*课程中存储Player来解决这个问题。如果你永远不需要改变它,那就太棒了。