我有一个运行在SKEmitterNode
上的SKScene
并且我想将它移动到下一个SKScene
而不打断粒子。
通常我会这样做:
let scene: SKScene = GameScene(size: self.size)
let transition = SKTransition.crossFade(withDuration: 0.5)
self.view!.presentScene(scene, transition: transition)
然后在下一个场景:
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
中移除并作为子级添加到新的SKEmitterNode
中。我的问题是,为什么会出现这种情况,我如何才能在不使用skscene之间的转换的情况下让它正常工作。任何帮助都将非常感谢,谢谢。
注意:使用持续时间为0的
SKTransition
也可以,但这会在转换期间引起明显的“闪光”。 最佳答案
不应该有闪光之类的。如果我正确理解您,您需要做的是在全局范围内创建一个发射器。在展示下一个场景之前,应该从其父场景中移除发射器。当你在下一个场景中时,你将向它添加发射器。我只是试过了,它对我没有任何延迟,闪光或什么。
这里是代码…有两个场景…aGameScene
:
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)
}
}
}
以及a
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)
}
}
}
对于发射器,我使用了标准的萤火虫模板。
关于swift - 添加到新SKScene时,SKEmitterNode会消失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43025877/