问题描述
这类似于这些问题: Is it possible to initialise two classes,that require pointers to each other,at the same time?
Two classes that refer to each other
但我正在寻找更通用或“最佳实践”的解决方案。
这是游戏设计中经常出现的一个问题:当许多对象需要来自其他对象的信息时,其中一个将不可避免地比任何其他元素“最下游”(就标题包含而言)。鉴于有成千上万的游戏,我假设有一些“好的”解决方案。
特别是,我有一个虚拟基类“GameObject”,我的所有游戏对象都属于它:玩家、子弹、僵尸……以及存储所有游戏对象的“GameObject*”映射。我的 GameState 类保存了这张地图,所有的 Game 对象都保留了指向地图的相同静态指针。每个游戏对象还有一个称为“碰撞”的向量
Class GameObject {
private:
static int objID;
int id;
//maps
static std::unordered_map<int,GameObj*>* objs;
public:
//list of collisions with other objects
std::vector<GameObj*> collisions;
//Accessors - some generic accessors
unsigned int getID() const;
ObjType getType() const;
sf::Vector2f getPos() const;
virtual const sf::FloatRect& getGlobalBounds() const = 0;
//And the key function,update
virtual STATE update() = 0;
}
我的 GameState 类包含一个方法,该方法调用 Player::update()(对于所有玩家,它是一个非静态方法),为所有僵尸调用 Zombies::update() 等等。 Update() 是 GameObject 的纯虚函数。
如果 Player.h 包含 Zombie.h,那么我可以进入我的播放器类,遍历我的子弹向量并检查它们中是否有任何一个与僵尸相撞。我可以根据需要删除项目符号、添加到玩家分数等。
但是,在我的 Zombie 课程中,我可以推断出僵尸与一颗子弹相撞,但我无法推断出这颗子弹造成了多少伤害,或者其他任何关于子弹,因为僵尸不知道子弹是什么(即,我不能动态投射 GameObj* 到 Bullet* 并使用访问器方法)。那么我们如何解决这个问题。
解决方案:
-
我想到一个原始的修复方法可能是在僵尸和玩家中都包含“Bullet.h”——这可能有效但不能解决更大的问题——说玩家对僵尸造成了直接伤害,例如。
-
类的“前向声明”在这里对我不起作用。编译器仍然对从 GameObject* 到 Bullet* 的动态转换感到愤怒
-
通过(通过包装器 gameState 类)传递所有子弹/僵尸信息是可能的,但很麻烦,更不用说我为所有游戏对象使用纯虚函数,其中大部分不会使用此信息正在传递。
-
我可以扩展我的 GameObject 类以保存有关 GameObject 的更多信息,例如其损坏情况。但是,对于某些游戏对象,这些信息是无关紧要的。
还有其他聪明的解决方案吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)