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

标签 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 可以在不同的表面上更快地移动。要知道玩家所在的表面需要访问属于 World 类的 Map 对象。

我们可以将其添加到虚拟更新方法中:

virtual void update(float delta, Map *map) = 0;

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

实体在其更新方法中需要的任何其他对象或变量也是如此。不久之后,方法定义中就会出现数十个参数(游戏 map 、其他实体列表、游戏状态信息)。

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

最佳答案

我在我的游戏中通过在 Player 类中存储一个 Map* 解决了这个问题。如果您永远不必更改它,效果很好。

关于c++ - 游戏模式中更新方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42638023/

相关文章:

c++ - C++ 中的函数隐藏怎么可能呢?

android - 如何从父类调用子类的方法?

c++ - 极简框架

c++ - 如何安全地将包含的对象(菜单项)与需要容器(菜单)的 API 同步?

c++ - 如何编写一个带有模板化函数参数的包装函数,它可以接受重载的成员函数?

c++ - 我应该将 std::begin 与数组一起使用吗?

c++ - 在我的 C++ 程序中,fwrite 和 write 都不起作用

oop - 什么时候使用继承?

java - 如何实现代理模式?

c++ - 使用信号设置值在 Qt 中的行为不符合预期