【问题标题】:SKEmitterNode isn't removing itself from parent?SKEmitterNode 没有从父节点中删除自己?
【发布时间】:2015-10-22 03:28:51
【问题描述】:

我将 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 swift ios8 sprite-kit skemitternode


    【解决方案1】:

    particleLifetime 确定粒子的平均寿命,以秒为单位。这不会影响从父级删除 SKEmitterNode。

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

    所以,如果你想在发射器发射完成后从父节点中移除节点,你可以设置发射的粒子数(Particles 区域中名为 Maximum 的字段在编辑器中)并运行一个 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!)
    
    
    
        }
    
    
    }
    

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

    希望对你有帮助

    编辑:

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

    重点是使用颜色渐变,并选择添加作为混合模式。

    这是 .sks 文件的 Dropbox 链接:Effect.sks

    【讨论】:

    • 更准确的发射器持续时间应该是这样的:let duration = Double(emitter.numParticlesToEmit) / Double(emitter.particleBirthRate) + Double(emitter.particleLifetime + emitter.particleLifetimeRange/2)
    • 这是一个非常酷的SKEmitterNode动画!您介意分享 SKS 文件(或解释如何重新创建此文件)吗?
    • @Crashalot 我已经尝试重新创建它,我想我得到了一些可以让您大致了解如何获得类似效果的东西。抱歉,那是两年前的事了,我忘记了确切的设置。
    • 谢谢!另外,您是如何获得它来创建半结构化的顺时针动画的?这是另一个有趣的地方。
    • 啊,顺时针运动既不是程序化的,也不是单个发射器节点……我以为你是用单个发射器节点创建这个效果的,还是很酷! :)
    【解决方案2】:

    将您的粒子“BirthRate”和“Maximum”都设置为 20。将最大值设置为 0 将重复出生。

    【讨论】:

      猜你喜欢
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多