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

问题描述 投票:0回答:1

我有一个非常具体的......好吧,不要把它称为问题,让我们把它称为死锁。我正在使用allegro5和c ++编写一个简单的2D游戏,并且有一个我想克服的特定问题。

主要问题:

目前,对于游戏循环我正在使用一个列表容器,它容纳我的所有对象(类型为GameObject),然后迭代它来做更新对象位置,渲染和动画精灵等事情。

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

出现的问题是,当迭代我的GameObjects主列表(也包括Creatures)时,我不能直接使用我的Creatures类的方法。当然我理解为什么我不能这样做(封装)。

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

我是一个非常初学的程序员,因为我知道创建一个游戏可能对我的技能水平有点过分,我决心用任何手段推动这个游戏向前发展。 (特别是因为到目前为止我学到了很多东西)

我希望我已经详细解释了一个问题 - 我这里没有提出任何代码,因为它更像是一个理论上的问题然后是实际问题,毕竟迭代一个GameObject列表。

带着敬意,

c++ casting containers allegro5
1个回答
0
投票

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

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

当你提出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 *的单独列表,这样您就不必投射它们。是的,你将使用一个/更少/更多的内存,但不是很多。能够迭代生物列表而不迭代实体列表可以提高您的性能。为了简化操作,请创建自己的容器,其中包含每种类型对象的列表以及所有对象的主列表。如果您不关心其派生类,请迭代主列表。如果你关心它们是什么类,请迭代它们的特定列表。

© www.soinside.com 2019 - 2024. All rights reserved.