重新启动SKEmitterNode而不删除粒子

时间:2016-12-05 20:12:51

标签: swift sprite-kit skemitternode

我对枪口喇叭口设置有粒子效果。我现在使用的是一个低numParticlesToEmit,用于将发射器限制为短脉冲串,并且每当我想要开始新的粒子爆发时,就在发射器上执行resetSimulation()。

我遇到的问题是resetSimulation()会移除屏幕上的所有粒子,而且我经常需要在之前的粒子正常消失之前创建一个新的粒子阵列,这样它们就会被提前删除。

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

3 个答案:

答案 0 :(得分:3)

通常,粒子系统具有SKEmitters缺少的特征:持续时间。这可以控制系统发出的时间。我在SKEmitter中没有看到这一点,尽管在SCNParticleSystems

没关系,解决方法:

SKEmitters拥有numParticlesToEmit属性和particleBirthRate。结合起来,这些决定了粒子系统在关闭之前发出的时间。

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

我不确定当它达到这个极限时它是否会自动重新调整。如果没有,您将必须创建某种删除功能。因为获得所需效果的方法(屏幕上有多个枪口闪光)是copy() SKEmitter。这非常有效,所以不要担心开销。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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)
    }
}