Answers:
这是一个好主意。您将需要在您的飞船周围进行某种扩散。我可能会想到三种物理模型:
您希望它看起来几乎像是一种液体介质,压力梯度会重新平衡,即,一旦您传递了一些粒子,它们就会移回您的尾流中(就像船后的水一样)。在这种情况下,粒子的位置是绝对的,只是它们与播放器的关系会临时修改其渲染位置。这有点像当您在物体上通过厚厚的放大镜时,衍射似乎使它们移动了-但是直到您将玻璃移开为止。在这种情况下,您的船就是玻璃。
如果您希望他们离开船,并在他们移动后继续前进。这就像在没有压力梯度(或很小)的通常为空的空间中的标准物理学一样。
您要像(1)和(2)中那样将粒子从飞船靠近时迅速移开,但是一旦飞船离开,粒子将缓慢地重新平衡自己,以保持等距离。
这三种解决方案的共同点:您需要具有随舰船移动的扩散场。在此示例中,我们将其设为圆形。然后,您可以检测到飞船与该区域内每个粒子之间的向量,称为v1。将您的粒子沿着该向量推开。您将其推开的力度取决于它与船的距离:use 1 - v1.magnitude
。该公式将为您提供线性强度,但是您可以对其进行修改,以使用诸如圆形强度曲线之类的其他东西,该曲线会降低朝向边缘的强度。这将给人更多的感觉,好像船周围有球形而不是圆形的压力梯度。
对于解决方案1:现在,您要做的就是通过此向量在每个渲染更新上修改该粒子的渲染位置(即精灵位置)。因为您是用这种方式做的,所以这纯粹是一种渲染效果,对粒子的实际世界位置没有影响。因此,您可以将世界位置添加到渲染偏移量(v1)中,现在,当您向它们旁边或旁边移动时,它们具有很好的位移粒子,并且在经过时(在后面)可以平滑地还原粒子。
对于解决方案2:不仅将v1应用于视图位置,还应在每次逻辑更新时将其应用于粒子的位置。因此,p1.position += v1
。因此,您要对粒子施加加速力,这会转化为速度。可能需要衰减每个粒子的速度,以使它们逐渐减速并在通过后停止。您会看到此解决方案将如何导致星云中聚集的粒子,因为它们永远不会扩散。我敢肯定,这不是很现实,因为星云内部都存在压力梯度,无论现实中有多弱。
对于解决方案3:与(2)相同,但是在这种情况下,您将不得不重新扩散粒子。要轻松做到这一点有点蛮力,但是由于这些只是粒子,因此让人眼花dy乱,因此您可能不需要覆盖很大的兴趣区域(可能仅是playerPosition + maxPlayerSpeedPerTick的半径,或其他任何值)出于逻辑目的,矩形区域对此进行了限制)。每个粒子将在目标区域内的每个其他粒子上施加力。他们将再次根据彼此之间的距离施加力。一次扫描感兴趣区域中的所有粒子间力,然后一次扫描中施加所有力。最后,请确保仅对速度为零的粒子执行粒子间力处理。一旦给定的粒子达到某个最低速度,
那里有各种各样的扩散公式等,但是我认为在这种情况下,简单的解决方案效果最好。