我添加了SKEmitterNode作为mainScene的childNode,并且比预期的那样,它在particleLifetime结束时将被删除,如apple docs所述。

像这样添加了发射器;

    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)

我的SKEmitterNode属性如下图所示
ios - SKEmitterNode不会从父级中删除自身吗?-LMLPHP

当我运行它时,不会从屏幕上删除发射器。

ios - SKEmitterNode不会从父级中删除自身吗?-LMLPHP

如果您需要更多信息,我不知道该添加些什么,请提出任何帮助,谢谢。

最佳答案

particleLifetime 确定粒子的平均生命周期(以秒为单位)。这不会影响从父级删除SKEmitterNode。

numOfParticlesToEmit 是指“粒子编辑器”的“粒子”区域中的“最大”字段,它确定发射器在停止之前应发射的粒子数。这也不会影响从父级删除SKEmitterNode。另请注意,您在此字段中设置了0,这将启用无限发射。

因此,如果要在发射器完成发射后从父节点移除节点,则可以设置要发射的粒子数(在编辑器内的“粒子区域”中称为“最大值”的字段),并运行SKAction序列,该序列将:

  • 启动发射器
  • 等待一段时间
  • 并从父级移除发射器(此时,发射器应以发射完成)

  • 这是一个简单的示例,向您展示如何使用SKAction序列执行此操作:
    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!)
    
    
    
        }
    
    
    }
    

    这是结果(请注意,完成发射后,节点的计数如何变化):

    ios - SKEmitterNode不会从父级中删除自身吗?-LMLPHP

    希望这可以帮助

    编辑:

    对于那些对如何像上面的视频那样产生类似效果感兴趣的人,请尝试以下类似的方法:

    ios - SKEmitterNode不会从父级中删除自身吗?-LMLPHP

    关键是要使用“色阶”,并选择“添加”以使用混合模式。

    这是.sks文件的保管箱链接:Effect.sks

    关于ios - SKEmitterNode不会从父级中删除自身吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31729436/

    10-09 09:39