实施爆炸

我想添加爆炸到我的2D游戏,但我很难与建筑。 有几个游戏元素可能是爆炸的原因,比如爆炸桶和子弹(可能会发生连锁反应)。 唯一的select我可以拿出来是:

1 – 有一系列的爆炸,并把它们当作游戏元素,与其他游戏一样重要

优点:有一个单独的数组,更新和绘制所有其他游戏元素数组使得它更有组织和简单的更新,乍一看爆炸桶很容易创建,只需将爆炸数组作为指针到每个炸药桶的构造

缺点:子弹可能很难为vector增加一个爆炸,因为子弹是由位于每个暴徒的武器类射击的,所以可以说,如果我创建一个新的敌人并将其添加到敌人arrays,那个敌人将有一个武器和function可以使用它,如果我想要武器(在这种情况下火箭发射器)有权访问爆炸arrays可以添加一个新的,ID必须通过爆炸arrays作为指向敌人的指针,然后将其传递给武器,并将其传递给子弹(丑陋链)。 我能想到的另一个问题是更奇怪:如果我检查爆炸和桶之间的碰撞(所以我创建一个连锁反应),我发现与桶爆炸碰撞,如果我添加一个新的爆炸,而即时迭代爆炸java会抛出一个exception。 所以这有点烦人,我无法迭代爆炸,并添加一个新的爆炸,我必须以另一种方式做…

另一种不是真正深思熟虑的方式,就是为每一个可能爆炸的元素添加一个爆炸性的元素,以便当它死亡,爆炸或什么,但是我没有很好的方法来实现这个理论

老实说,我不喜欢任何解决scheme,所以编号喜欢知道如何通常由实际的游戏开发者,如果我的问题似乎微不足道,愚蠢对不起。

至于跟踪你的爆炸,一个很大的arrays可能是很好的原型小东西,但正如你发现,它不能很好地扩展和传递它可以变得丑陋。 这里有几个解决scheme:

  1. 实现一个ExplosionManager 。 优点:不需要传递一个引用到你的爆炸arrays。 轻松分组更新它所负责的元素。 缺点:它和利用它的代码段之间有很高的耦合度。 还是一个比较具体的游戏元素(这使我想到两个…)
  2. 实施一个适当的场景图。 这绝对是一个比scheme一更大的事业。 在爆炸的情况下,当游戏中的东西创建一个时,爆炸会在graphics中显示出来,自动允许渲染它。 优点:爆炸(和所有其他游戏元素)可以一般对待(从Unity认为GameObject )。 比选项1更低的耦合。 缺点:大量的工作。 分散类似对象的更新有时效率不高。

就创建连锁反应而言,你可以在游戏环境中有一定距离的爆炸查询对象,并向他们传达附近发生爆炸事件。 物体相应地作出反应。

MarkR已经为您的问题提供了一个很好的答案,在操作时修改列表。 我唯一的建议就是在操作之前复制列表并在副本上进行操作。 与使用“新”和“死”对象数组相比,它可能会有点混乱。

更新 :一个ExplosionManager将作为一个全局访问的单身实施。 我的Java是生锈的,但最终的代码看起来像这样:

 ExplosionManager.addExplosion(new Explosion()); 

在游戏的主要更新循环中的某处,您可以:

 ExplosionManager.update(deltaTime); 

class级的责任是监督游戏中每一次爆炸的存在。 它持有他们的一生,并更新他们。 示例代码和单例模式的解释可以在这里find。

就场景图而言,是的,这是很多的。 这涉及到你想要做多less投资。 如果你的游戏非常小,并没有计划将其分支到另一个项目,你并不需要一个场景图。 如果游戏规模将会变大,或者你打算从这个游戏的架构中制作其他游戏,那么场景图可能是一个很好的投资。 我最终可能会写很多关于场景的图表,所以要了解更多信息,我会把你引荐到维基页面 。

你可以使用多态来存储一个“大对象列表”。 在Java中,我通常会使用一个ArrayList(虽然我没有写任何Java 7年或某事)。

所以你存储了你的基类“游戏对象”类(我通常称为我的游戏对象,如何无聊!)的对象的数组列表。

然后你可以迭代它,并做一些事情上的操作(在基类中定义,可以有被覆盖的默认实现)。 所以,如果有一个基类方法reactToNebybyExplosion(MyVectorType where),那么你可以调用每个附近的对象,如果它忽略它,那很好。

为了避免在迭代时添加到列表中的问题(在其他语言(不仅仅是Java)中也一样),我通常会使用另一个列表“newObjects”。

所以假设我有一个ThingManager类,并且它的一个实例跟踪我所有的GameObjects,它将有三个ArrayLists,可以被称为currentThings,newThings和deadThings。

“newThings”是在当前框架中被添加的东西,并且在其他处理结束时将被移动到currentThings。

“deadthings”是最近已经死亡的东西,还没有被清理(这有时很重要,特别是在没有弱引用的语言中)

我通常在我的GameObject上实现一个方法(属性?),“dead”在对象“离开”时返回true,即从游戏中删除并停止用于任何事情。 管理员可以将其从当前列表中删除,也可以从其他任何想知道其他事物是否已经死亡的对象中读取。

道歉相当广泛的咆哮,但这就是我如何处理它。