Остановить SKEmitterNode для испускания частиц
У меня есть SKEmitterNode
и я пытаюсь остановить это, когда кнопка нажата. Я добавляю свой узел следующим образом:
let followLine = SKAction.followPath(border.CGPath, asOffset: false, orientToPath: true, duration: 2.0)
let loopAction = SKAction.repeatActionForever(followLine)
emitterNode.targetNode = scene
emitterNode.runAction(loopAction, withKey: "loop")
addChild(emitterNode)
Я добавляю emitterNode в мой SKScene
и когда я хочу остановить частицы, я попробовал все эти возможные способы:
let action = SKAction.runBlock { [weak self] in
self?.emitterNode.particleBirthRate = 0
}
emitterNode.runAction(action)
emitterNode.removeAllActions()
emitterNode.removeFromParent()
removeAllActions()
let remove = SKAction.removeFromParent()
emitterNode.removeActionForKey("loop")
emitterNode.runAction(remove)
Излучатель не останавливается и анимация продолжается.
1 ответ
Решение
Я понял, что это проблема с моим кодом. Я пытался остановить узел эмиттера, который был создан в свойстве компьютера и поэтому был выделен очень долго, когда к нему обращались. Экземпляр явно не был прежним, и узел-эмиттер не останавливался. Это мой совет. Не путайте синтаксис свойств компьютера с синтаксисом для инициализации свойства с замыканием. Эти две части кода очень разные:
// Created only once
var laserButton: ParticlesLoadingButton = {
let button = ParticlesLoadingButton(frame: CGRect(x: 100, y: 100, width: 200, height: 100))
button.particleEffect = .Laser
button.particleColor = UIColor.orangeColor()
return button
}()
// Created every time it is accessed
var laserButton2: ParticlesLoadingButton {
let button = ParticlesLoadingButton(frame: CGRect(x: 100, y: 100, width: 200, height: 100))
button.particleEffect = .Laser
return button
}