iosswiftios8sprite-kitskemitternode

SKEmitterNode isn't removing itself from parent?


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

Added emitters like this;

    var emitterPath : String = NSBundle.mainBundle().pathForResource("ShipFire", ofType: "sks")!
    var emitter : SKEmitterNode = NSKeyedUnarchiver.unarchiveObjectWithFile(emitterPath) as! SKEmitterNode

    emitter.position = position
    emitter.particleLifetime = 0.1;

    self.addChild(emitter)

My SKEmitterNode properties like image below ShipEngine.sks

When I run it emitters aren't removed from screen.

Simulator

I don't know what to add more if you need more information please ask any help would be appreciated thanks.


Solution

  • 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:

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

    Removing emitters from scene

    Hope this helps

    EDIT:

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

    emitter setup

    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