c++ - 游戏项目的多对象类型容器或动态转换?

标签 c++ casting containers allegro5

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

主要问题:

目前,对于游戏循环,我正在使用一个列表容器,它包含我所有的对象(类型为 GameObject),然后我对其进行迭代以执行诸如更新对象位置、渲染和动画 Sprite 等操作。

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

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

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

我是一个非常新手的程序员,据我所知,创建游戏对我的技能水平来说有点过分了,我决心不惜一切代价插入这款游戏向前发展。 (尤其是到目前为止我已经学到了很多东西)

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

关于,

最佳答案

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

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

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

您可以对存储在容器中的基指针使用 dynamic_cast 来确定该对象是否实际上是从您的基类派生的不同类型。

请参阅此处有关 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 遍历整个基类指针列表以确定对象是否属于指定类型,那将是一种浪费。

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

关于c++ - 游戏项目的多对象类型容器或动态转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37235580/

相关文章:

c++ - 使用 Linux 访问并口

c++ - 如何使用epoll_event data.ptr

c++ - 'juce::WildcardFileFilter' 的初始化没有匹配的构造函数

css - 以内容宽度展开容器 div

html - 如何解决我的 CSS 问题?

java - 构建非常简单的极简 Java 插件容器

c++ - 从 'float' 到 'LONG' 的转换需要缩小转换

c++ - Qt QMetaObjects 和从 QWidget 到 QObject 的转换

java - 如何将子类对象转换为父类(super class)对象

c++ - 如何将字节数组转换为整型(int、long、short等) 'endian safely'?