0

我有一个以我的播放器为中心的 SKEmitterNode 以留下粒子痕迹。我的玩家有一个物理体,它是由物理移动的,而不是通过手动更新它的位置。

我遇到的问题是,当我的玩家速度增加时,粒子会从玩家身后的某个点发射出来。我发现这是因为粒子是在帧周期的“评估动作”部分发射的。我的播放器随后被“模拟物理”部分移动。

我找到的解决方法是将 SKEmitterNode(在更新回调中)移动到我的玩家将在物理计算之后所在的位置。这是我使用的代码:

particleEmitter.position = CGPointMake(
    player.position.x + player.physicsBody!.velocity.dx * dt,
    player.position.y + player.physicsBody!.velocity.dy * dt
)

更新
起初我将发射器作为播放器的子节点,然后是我观察到问题的时候。
我还尝试将发射器位置精确地同步到玩家位置,而不考虑自上次更新以来移动的距离(速度 * dt),同样的问题。

我的问题是,解决这个问题的正确方法是什么?

更新 2
我创建了一个游乐场来演示这个问题。在这里,我将发射器作为玩家的孩子。玩家速度增加得越多,玩家和发射粒子之间的间隙就越大。
https://github.com/ovidiupruteanu/SKEmitterNodeTest-Playground


这是来自苹果文档的帧周期 在此处输入图像描述

4

2 回答 2

0

与其在每一帧上手动重新定位发射器,不如让 SpriteKit 为您完成这项工作:使发射器成为玩家精灵的子节点,并且每当玩家移动时,发射器点将保持在相对于玩家的相同位置。

如果你走这条路,你可能会遇到问题,发射的粒子也会以你不想要的方式跟随玩家。您可以通过将发射器设置为targetNode包含播放器的节点来解决此问题。

于 2014-11-05T22:10:03.673 回答
0

您的代码仅估计玩家的下一个位置。它没有考虑其他可能影响玩家位置的因素,例如碰撞、力场、线性阻尼等。我建议你在 didSimulatePhysics 回调中将发射器的位置设置为玩家的位置,或者将发射器添加为玩家的孩子.

于 2014-11-05T21:52:08.953 回答