添加到新的 SKScene 时 SKEmitterNode 消失
SKEmitterNode disappears when added to a new SKScene
我有一个 SKEmitterNode
是 SKScene
上的 运行,我想将它移动到下一个 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
也可以,但这会在过渡期间导致明显的 'flash'。
不应该有任何闪光之类的。如果我理解正确的话,您需要做的是在全局范围内创建一个发射器。在呈现下一个场景之前,您应该从其父级移除发射器。当您在下一个场景中时,您可以向其中添加发射器。我刚试过,它对我有用,没有任何滞后、闪烁或其他问题。
下面是代码...有两个场景...A 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)
}
}
}
对于发射器,我使用了标准萤火虫模板。
我有一个 SKEmitterNode
是 SKScene
上的 运行,我想将它移动到下一个 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
也可以,但这会在过渡期间导致明显的 'flash'。
不应该有任何闪光之类的。如果我理解正确的话,您需要做的是在全局范围内创建一个发射器。在呈现下一个场景之前,您应该从其父级移除发射器。当您在下一个场景中时,您可以向其中添加发射器。我刚试过,它对我有用,没有任何滞后、闪烁或其他问题。
下面是代码...有两个场景...A 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)
}
}
}
对于发射器,我使用了标准萤火虫模板。