SKEmitterNode在添加到新的SKScene时消失



我有一个在SKScene上运行的SKEmitterNode,我想在不中断粒子的情况下将其移动到下一个SKScene

通常我会像下面这样做:

let scene: SKScene = GameScene(size: self.size)
let transition = SKTransition.crossFade(withDuration: 0.5)
self.view!.presentScene(scene, transition: transition)

然后在下一个SKScene:

override func didMove(to view: SKView) {
    particleEmitter.removeFromParent()
    addChild(particleEmitter)
}

这工作得很好,但是在这种情况下,我不想在移动到下一个 SKScene 时使用过渡。我已经尝试过没有过渡,例如:

let scene: SKScene = GameScene(size: self.size)
self.view!.presentScene(scene)

一旦出现新SKSceneSKEmitterNode就会消失,即使我已经从上一个SKScene中删除了它并将其作为子项添加到新中。

我的问题是为什么SKEmitterNode消失了,我怎样才能让它在不使用 SKSceene 之间的过渡的情况下工作。任何帮助将不胜感激,谢谢。

注意:使用持续时间为 0 的SKTransition也可以,但这会导致过渡期间出现明显的"闪光"。

不应该有任何闪光之类的。如果我理解正确,您需要做的是在全局范围内创建一个发射器。在呈现下一个场景之前,应从其父级中删除发射器。当您在下一个场景中时,您可以向其添加发射器。我刚刚尝试过,它对我有用,没有任何滞后,闪光或其他东西。

这是代码...有两个场景...GameScene

import SpriteKit
let emitter = SKEmitterNode(fileNamed: "Fireflies")
class GameScene: SKScene {
    override func didMove(to view: SKView) {
        backgroundColor = .black
        if let emitterNode = emitter {
             addChild(emitterNode)
        }
         print("Game Scene")
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let scene = WelcomeScene(fileNamed: "WelcomeScene") {
            scene.scaleMode = .aspectFill
            emitter?.removeFromParent()
            self.view?.presentScene(scene)
        }
    }
}

WelcomeScene

import SpriteKit
class WelcomeScene:SKScene{
    override func didMove(to view: SKView) {
        backgroundColor = .black
         print("Welcome Scene")
        if let emitterNode = emitter {
            addChild(emitterNode)
        }
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let scene = GameScene(fileNamed: "GameScene") {
            scene.scaleMode = .aspectFill
            emitter?.removeFromParent()
            self.view?.presentScene(scene)
        }
    }
}

对于发射器,我使用了标准萤火虫模板。

最新更新