游戏项目的多对象类型容器或动态投射?

Multiple object type container or dynamic casting for a game project?

我有一个非常具体的...好吧,我们不要称之为问题,而是称之为僵局。我正在使用 allegro5 和 c++ 编写一个简单的 2d 游戏,并且有一个我想克服的特定问题。

主要问题:

目前,对于游戏循环,我正在使用一个列表容器,它将我所有的对象(GameObject 类型)保存在里面,然后我在它上面迭代以执行更新对象位置、渲染和动画精灵等操作.

从 class GameObject(保存用于更新、渲染和内存处理方法的通用信息)继承了一个 Creature class,它应该处理诸如攻击方法之类的事情。

出现的问题是,在迭代我的主要游戏对象列表(其中也包括生物)时,我无法直接使用我的生物 class 的方法。我当然明白为什么我做不到(封装)

到目前为止,我已经找到了几个可能的解决方案(在我看来,这些解决方案并不完美),但我想寻求帮助以帮助找到易于实施且有效的解决方案: - 使用可以容纳多种对象类型的容器。 - 在某些时候使用 dynamic_cast,将生物 GameObjects 转换为 Creature class 以临时使用 Creature 方法和变量(这甚至可能吗?) - 设置第二个容器来处理 Creature 方法和变量(我想避免这种情况,因为那时我需要一个对象同时在两个容器中 - 添加新类型的 classes 'buildings'、'obstacles' 或 'arrows' 他们的人数会增加!)

我是一个非常初级的程序员,据我所知,创建游戏对我的技能水平来说有点过分了,我决心不惜一切代价推动这款游戏的发展。 (特别是到目前为止我学到了很多东西)

我希望我已经详细解释了一个问题 - 我不会在这里提出任何代码,因为它更多的是理论问题而不是实际问题,毕竟我只是迭代一个 GameObject 列表。

问候,

如您所知,容器一次只能容纳一种类型的对象。

如果该对象类型是基 class 指针,它可以指向从基 class 派生的任何对象。但是,您需要先将指针转换为适当的类型,然后才能使用它的特定功能。

您在提出 dynamic_cast 时回答了自己的问题。

您可以在容器中存储的基指针上使用 dynamic_cast 来确定该对象是否实际上是从您的基 class.

派生的不同类型

请参阅此处有关 dynamic_cast 的部分:

http://www.cplusplus.com/doc/tutorial/typecasting/

例子

Derived* d = dynamic_cast<Derived*>(ptr_base_class);
if (d) {/* We now know that ptr_base_class holds an object of type Derived */}
else {
   /// This object is not a Derived class type
}

但是,如果您必须使用 dynamic_cast 遍历整个基 class 指针列表来确定对象是否属于指定类型,那将是一种浪费。

这里是您再次回答自己问题的地方。保留所有 Creature* 的单独列表,这样您就不必施放它们。是的,您将使用 /little/ 更多内存,但不会太多。能够在不迭代实体列表的情况下迭代生物列表可以提高性能。为了使事情变得更容易,制作您自己的容器,其中包含每种类型的对象的列表以及所有对象的主列表。如果你不关心他们的派生class,迭代主列表。如果您关心 class 它们是什么,请迭代它们的特定列表。