我的播放器中心有一个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
这是来自apple docs的帧循环
答案 0 :(得分:0)
您的代码仅估算播放器的下一个位置。它没有考虑可能影响玩家位置的其他因素,例如碰撞,力场,线性阻尼等。我建议你将发射器的位置设置为玩家在didSimulatePhysics回调中的位置,或者将发射器添加为玩家的孩子
答案 1 :(得分:0)
不要手动地在每一帧上重新定位发射器,让SpriteKit为你做这件事:让发射器成为玩家精灵的子节点,并且每当玩家移动时,发射器点将保持相对于玩家的相同位置
如果你走这条路线,你可能会遇到一个你不想要的方式跟随玩家的问题。您可以通过将发射器的targetNode
设置为包含播放器的节点来解决此问题。