SKEmitterNode isn't removing itself from parent?

前端 未结 2 1258
旧时难觅i
旧时难觅i 2020-12-19 18:34

I added SKEmitterNode as a childNode of my mainScene and than expected that It would be removed when particleLifetime ends, described like apple docs.

A

相关标签:
2条回答
  • 2020-12-19 19:14

    particleLifetime determines the average lifetime of a particle, in seconds. That doesn't affect on removal of SKEmitterNode from parent.

    numOfParticlesToEmit which refers to Maximum field in Particles area of Particle Editor determines the number of particles that emitter should emit before stopping. That doesn't affect on removal of SKEmitterNode from parent too. Also note that you've set 0 in this field which will enable infinitely emitting.

    So, if you want to remove node from parent when emitter is done with emitting, you can set the number of particles to emit (field called Maximum in Particles area inside editor) and run an SKAction sequence which will:

    • start an emitter
    • wait for some duration of time
    • and remove the emitter from parent (at this point emitter should finish with emitting)

    Here is an simple example to show you how to do this with SKAction sequence:

    class GameScene: SKScene {
    
    
        let emitter : SKEmitterNode = NSKeyedUnarchiver.unarchiveObjectWithFile(NSBundle.mainBundle().pathForResource("MyParticle", ofType: "sks")!) as SKEmitterNode
        override func didMoveToView(view: SKView) {
    
            self.backgroundColor = SKColor.blackColor()
    
    
        }
    
        func addEmitter(position:CGPoint){
    
            var emitterToAdd   = emitter.copy() as SKEmitterNode
    
            emitterToAdd.position = position
    
            let addEmitterAction = SKAction.runBlock({self.addChild(emitterToAdd)})
    
            var emitterDuration = CGFloat(emitter.numParticlesToEmit) * emitter.particleLifetime
    
            let wait = SKAction.waitForDuration(NSTimeInterval(emitterDuration))
    
            let remove = SKAction.runBlock({emitterToAdd.removeFromParent(); println("Emitter removed")})
    
            let sequence = SKAction.sequence([addEmitterAction, wait, remove])
    
            self.runAction(sequence)
    
    
        }
    
        override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    
    
            let touch: AnyObject? = touches.anyObject()
    
            let location = touch?.locationInNode(self)
    
            self.addEmitter(location!)
    
    
    
        }
    
    
    }
    

    And here is the result (note how node's count is changing after emitting is done) :

    Hope this helps

    EDIT:

    For those interested in how to make similar effect like from the video above, try with something like this:

    The point is to use Color Ramp, and to choose Add for a blend mode.

    Here is the dropbox link to the .sks file : Effect.sks

    0 讨论(0)
  • 2020-12-19 19:19

    Set your Particle "BirthRate" and "Maximum" both to 20. Setting the max to 0 will repeat the birth.

    image

    0 讨论(0)
提交回复
热议问题