【问题标题】:SKEmitterNode disappears when added to a new SKScene添加到新的 SKScene 时,SKEmitterNode 消失
【发布时间】:2017-03-26 06:41:38
【问题描述】:

我有一个在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)

SKEmitterNode 会在新的SKScene 出现后立即消失,即使我已将其从上一个SKScene 中删除并将其作为子项添加到新的SKScene

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

注意:使用持续时间为 0 的 SKTransition 也可以,但这会在过渡期间导致明显的“闪烁”。

【问题讨论】:

    标签: swift sprite-kit skscene skemitternode


    【解决方案1】:

    不应该有任何闪光之类的。如果我理解正确,您需要做的是在全局范围内创建一个发射器。在呈现下一个场景之前,您应该从其父级移除发射器。当您在下一个场景中时,将发射器添加到它。我刚刚尝试过,它对我有用,没有任何延迟、闪烁或其他问题。

    这是代码...有两个场景...一个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)
            }
    
        }
    }
    

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

    【讨论】:

    • 感谢您的帮助,这正是我最初尝试做的,但它不适合我。话虽这么说,我又试了一次(实际上只是取消了原始代码的注释),它突然工作正常......我会将此标记为正确的,谢谢。
    • @jm1175 也许其他原因是滞后的原因。你知道,用纹理等初始化精灵。不管怎样,很高兴听到它对你有用! :) 编码愉快。
    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多