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

时间:2016-05-15 07:21:17

标签: c++ casting containers allegro5

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

主要问题:

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

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

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

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

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

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

关于,

1 个答案:

答案 0 :(得分:0)

您已经发现,容器一次只能容纳一种类型的对象。

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

当您打开dynamic_cast时,您回答了自己的问题。

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

在此处查看有关dynamic_cast的部分:

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

示例

string titlePattern =  @"(\b\W[^A-Za-z0-9]+)";

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

在这里您再次回答了自己的问题。单独保存所有Creature *的列表,这样就不必强制转换它们。是的,您将使用/ little /更多的内存,但是数量不多。能够遍历Creature列表而不遍历实体列表可以提高性能。为了使事情变得容易,请制作自己的容器,该容器具有每种对象类型的列表以及所有对象的主列表。如果您不关心它们的派生类,请遍历主列表。如果您关心它们是什么类,请遍历其特定列表。