【问题标题】:SKEmitterNode emitting particles before physics are simulatedSKEmitterNode 在模拟物理之前发射粒子
【发布时间】:2014-11-05 21:00:16
【问题描述】:

我有一个以我的播放器为中心的 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


这是来自苹果文档的帧周期

【问题讨论】:

  • 你有什么问题?您是否正在寻找实施方案的替代方案?
  • 经过更多测试并看到@0x141E 的答案后,我确实发现我的解决方法存在一些问题。例如,当玩家通过与另一个物体碰撞而完全停止(在高速行驶后)时,一些粒子会在我的玩家停止点之外生成。

标签: ios swift sprite-kit skemitternode


【解决方案1】:

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

【讨论】:

  • 我确实尝试了您的两个建议。问题是粒子在到达 didSimulatePhysics 回调时已经生成,因此在该点将位置设置为玩家位置并没有帮助。我知道我所做的是对玩家下一个位置的估计,但是从我所看到的情况来看,这是一个很好的估计。
  • 如果玩家移动得如此之快以至于它超过了它的孩子,那么你可能超出了 sprite kit 可以处理的限制。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多