【问题标题】:Restart SKEmitterNode without removing particles重启 SKEmitterNode 而不移除粒子
【发布时间】:2017-04-20 08:00:45
【问题描述】:

我为枪口照明弹设置了粒子效果。我目前使用的是一个低 numParticlesToEmit 来将发射器限制为短暂的爆发,并在我想开始新的粒子爆发时在发射器上执行 resetSimulation()。

我遇到的问题是 resetSimulation() 会删除屏幕上的所有粒子,并且我经常需要在之前的粒子正常消失之前创建一个新的粒子爆发,以便它们尽早被擦除。

有没有一种干净的方式再次启动发射器而不擦除屏幕上已经存在的粒子?

【问题讨论】:

    标签: swift sprite-kit skemitternode


    【解决方案1】:

    通常粒子系统有一个 SKEmitters 缺少的特性:持续时间。这控制了系统发射多长时间。尽管在 SCNParticleSystems 中,但我在 SKEmitter 中看不到这个

    没关系,解决方法:

    SKEmitters 有一个numParticlesToEmit 属性和一个particleBirthRate。结合起来,这些决定了粒子系统在关闭之前发射多长时间。

    使用这些作为发射的控制,可以创建以您想要的方式发射的粒子脉冲,例如枪口闪光或爆炸。

    我不确定它是否会在达到此限制时自行清除。如果没有,您将不得不创建某种删除功能。因为获得所需效果的方法(屏幕上多次枪口闪烁)是copy()SKEmitter。这非常有效,所以不用担心开销。

    【讨论】:

    • 是的,效果很好。一个快速的 SKAction 等待序列,然后 removeFromParent 可以很好地处理删除。
    【解决方案2】:

    SKEmitters 上有一个targetNode,假设将粒子移动到另一个节点,这样当您重置发射器时,之前的粒子仍然存在。不幸的是,这仍然是我所知道的,除非其他人已经弄清楚如何让它工作而我只是错过了它。请记住这一点,以防他们修复它。

    【讨论】:

    • 顺便说一句,具有 SKScene 粒子的 SCNPlanes 将解决您在多个位置/视图中需要相同粒子的两个实例的问题。唯一的窍门,就是让 SCNScene 进入你的 SKScene。
    • 这需要sk3dnode已经知道了,但它是一个疯狂的混乱渲染
    【解决方案3】:

    您好,为了帮助未来的读者,我用来计算发射器持续时间的代码是这样的:

    let duration = Double(emitter.numParticlesToEmit) / Double(emitter.particleBirthRate) + Double(emitter.particleLifetime + emitter.particleLifetimeRange/2)

    它非常适合我

    扩展名:

    extension SKEmitterNode {
        var emitterDuration: Double {
            return Double(numParticlesToEmit) / Double(particleBirthRate) + Double(particleLifetime + particleLifetimeRange/2)
        }
    }
    

    【讨论】:

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