如何创建对玩家和敌人有反应的粒子?


38

我目前正在使用自己的游戏引擎制作游戏,该引擎是用C ++编写的,并且使用的是最新的Directx SDK。

该游戏是一款自上而下的太空射击游戏(具有非常有趣的变化),我希望玩家能够飞过这种星云。我真的想尝试并钉牢好几百种微粒,使其在飞入它们的过程中从玩家飞船中移出时产生良好的触感。有点像粒子如何在XBLA上的《 Geomtry Wars》中移出播放器。

在C ++方面,我是一位经验丰富的程序员。但是,我不知道如何开始实现这种效果。有没有人想提出任何很棒的想法或设计选择?随意回答您喜欢的任何深度。

Answers:


65

这是一个好主意。您将需要在您的飞船周围进行某种扩散。我可能会想到三种物理模型:

  1. 您希望它看起来几乎像是一种液体介质,压力梯度会重新平衡,即,一旦您传递了一些粒子,它们就会移回您的尾流中(就像船后的水一样)。在这种情况下,粒子的位置是绝对的,只是它们与播放器的关系会临时修改其渲染位置。这有点像当您在物体上通过厚厚的放大镜时,衍射似乎使它们移动了-但是直到您将玻璃移开为止。在这种情况下,您的船就是玻璃。

  2. 如果您希望他们离开船,并在他们移动后继续前进。这就像在没有压力梯度(或很小)的通常为空的空间中的标准物理学一样。

  3. 您要像(1)和(2)中那样将粒子从飞船靠近时迅速移开,但是一旦飞船离开,粒子将缓慢地重新平衡自己,以保持等距离。

这三种解决方案的共同点:您需要具有随舰船移动的扩散场。在此示例中,我们将其设为圆形。然后,您可以检测到飞船与该区域内每个粒子之间的向量,称为v1。将您的粒子沿着该向量推开。您将其推开的力度取决于它与船的距离:use 1 - v1.magnitude。该公式将为您提供线性强度,但是您可以对其进行修改,以使用诸如圆形强度曲线之类的其他东西,该曲线会降低朝向边缘的强度。这将给人更多的感觉,好像船周围有球形而不是圆形的压力梯度。

对于解决方案1:现在,您要做的就是通过此向量在每个渲染更新上修改该粒子的渲染位置(即精灵位置)。因为您是用这种方式做的,所以这纯粹是一种渲染效果,对粒子的实际世界位置没有影响。因此,您可以将世界位置添加到渲染偏移量(v1)中,现在,当您向它们旁边或旁边移动时,它们具有很好的位移粒子,并且在经过时(在后面)可以平滑地还原粒子。

对于解决方案2:不仅将v1应用于视图位置,还应在每次逻辑更新时将其应用于粒子的位置。因此,p1.position += v1。因此,您要对粒子施加加速力,这会转化为速度。可能需要衰减每个粒子的速度,以使它们逐渐减速并在通过后停止。您会看到此解决方案将如何导致星云中聚集的粒子,因为它们永远不会扩散。我敢肯定,这不是很现实,因为星云内部都存在压力梯度,无论现实中有多弱。

对于解决方案3:与(2)相同,但是在这种情况下,您将不得不重新扩散粒子。要轻松做到这一点有点蛮力,但是由于这些只是粒子,因此让人眼花dy乱,因此您可能不需要覆盖很大的兴趣区域(可能仅是playerPosition + maxPlayerSpeedPerTick的半径,或其他任何值)出于逻辑目的,矩形区域对此进行了限制)。每个粒子将在目标区域内的每个其他粒子上施加力。他们将再次根据彼此之间的距离施加力。一次扫描感兴趣区域中的所有粒子间力,然后一次扫描中施加所有力。最后,请确保仅对速度为零的粒子执行粒子间力处理。一旦给定的粒子达到某个最低速度,

那里有各种各样的扩散公式等,但是我认为在这种情况下,简单的解决方案效果最好。


助手,很遗憾,我目前没有声誉来支持您的答案(而且我只能做一次,这比应有的要少)。您绝对确定了我在第一个解决方案中正在寻找的东西。很棒的答案。老实说 谢谢!
马特·麦克唐纳

完全高兴,马特,这是一个很好的问题,值得动脑!
工程师

我还决定,只需对代码进行很少的更改,就可以将其应用于皮带内较小的小行星。再次感谢。
Matt McDonald
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.