管理不同类型实体的列表-有更好的方法吗?


9

我正在为移动设备开发2D太空游戏,但是它确实非常复杂,我的解决方案确实令人困惑,并且会产生很多重复的代码段。

我有一个世界一流的课程,其中有多个不同对象的清单,例如:

List<Enemy> enemys;
List<Projectile> projectiles;
List<Collectable> collectables;
List<Asteroid> asteroids;
List<Effect> effects;
..

每个列表都会根据世界一流水平进行更新。但是还不止如此。每个敌人都有一个引擎列表,以及一个被敌人更新的武器大佬列表。现在,每个引擎都将一些射击效果添加到世界列表“效果”中,并且每个武器租赁商都将弹丸添加到世界列表“弹丸”中。所有这些类都有不同的参数,因此我需要为每个类额外的更新和渲染功能。

至少它们都是“ GameObject”的子元素,“ GameObject”为它们提供了基本的东西,例如位置,速度和加速度矢量,边界多边形以及诸如applyForce和有限状态机之类的函数

有没有更好或更通用的方法可以做到这一点?就像一个包罗万象的类,其中包含所有不同对象的所有可能的参数和方法。(我认为这会产生更加混乱的代码)


这类似于我的问题:gamedev.stackexchange.com/questions/22559/…我建议查看给出的答案。
德里克(Derek)2012年

Answers:



3

在原始问题的范围内,一个选择是将列表分成操作而不是像您所拥有的类型。例如,当您创建一个新对象时,它将具有List<HasAI>和,List<Collidable>并且将其添加到所需的任何操作列表中,当对象被销毁时,它将自身从这些列表中删除。一个对象可以在多个列表中。

该选项的第二步是将您的类从层次结构重构为使用接口的类,因此您的HasAI类型是一个实现IBrains接口的类。匹配List<HasAI>仅需要对象具有IBrains接口。

那应该有助于清除一些复杂性。


2

我认为您需要做的是将渲染抽象到其自己的类中,我认为一个呈现给玩家,一个呈现给敌人(或者也许只是一个呈现给玩家,然后为玩家和敌人创建一个实例-并非100%确定游戏设计。)

您可以使用访问者模式让渲染器在各个对象之间循环并决定要绘制的内容,这可能会不太复杂。


2

使用基类并依赖多态是一个非常好的主意。但是,还有一些替代方法。Noel Llopis有两篇文章值得一读。我最近一直在研究面向数据的设计,并且认为它有一些优点。

这些文章在这里这里。与多态相比,它可以简化您的代码。但是像其他任何YMMV一样,看一下它是否适合您要实现的目标。多态使用继承,DOD使用聚合都有优点和缺点,因此选择您的毒药。


1

您可以利用OOP尤其是多态性。

基本上,您必须创建一个基类,所有游戏实体都将从该基类继承。该基类尽可能抽象,它将包含诸如Creation,Update和Destroy函数之类的内容。

然后,您从该类派生所有其他游戏对象。如果您的语言不支持,您可能还需要在代码中添加某种反射,以执行一些更高级的操作,但是如果您知道如何正确构造继承,则可以避免。


1
他已经做到了-他的所有课程都是GameObject的子级。他只需要将其一系列列表变成一个GameObjects列表即可。
SomeGuy 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.