Я создал SKEmitterNode, чтобы прикрепить его к своему игроку после его смерти. Это очень простой дым. Проблема в том, что игра вылетает, когда я:
1) Нажмите кнопку повтора и перейдите к той же сцене, в случайное время игра вылетает с ошибкой EXC_BAD_ACCESS.
2) Вернитесь на главный экран и нажмите «Играть» и перейдите к этой игровой сцене после смерти хотя бы один раз и создания узла-эмиттера.
В настоящее время SKEmitterNode является необязательной переменной класса. Когда игрок умирает, они устанавливают SKEmitterNode и прикрепляют его к сцене.
// Add death smoke
let smokePath: String = NSBundle.mainBundle().pathForResource("playerDeathSmoke", ofType: "sks")!
self.deathSmokeEmitter = NSKeyedUnarchiver.unarchiveObjectWithFile(smokePath) as? SKEmitterNode
self.deathSmokeEmitter?.name = "deathSmokeEmitter"
if let deathEmitter = self.deathSmokeEmitter {
deathEmitter.targetNode = self.scene
self.addChild(deathEmitter)
}
"self.addChild (deathEmitter)" вызовет сбой ПОСЛЕ перезагрузки сцены (дым ДЕЙСТВИТЕЛЬНО появляется). Точно так же код примера в документации SKEmitterNode добавляет узел эмиттера.
Я также пробовал различные вещи, чтобы исправить это, например, переопределил метод removeFromParent в спрайте Player и сам запустил на нем команду removeFromParent перед переходом между сценами.
override func removeFromParent() {
self.deathSmokeEmitter?.removeFromParent()
//self.deathSmokeEmitter?.targetNode = nil
super.removeFromParent()
}
После этого сбой будет происходить только при ВОЗВРАТЕ сначала на главный экран, а затем при переходе обратно в игровую сцену. Это означает, что я могу делать быстрые попытки снова и снова столько раз, сколько захочу, если это закомментировано, но он все равно вылетает, если я вернусь к домашней сцене и вернусь к сцене игры. Кроме того, когда он выходит из строя таким образом, трассировка стека показывает этот последний метод перед сбоем:
[SKEffectNode dealloc]
Пожалуйста, дайте мне знать, если у вас есть идеи и спасибо!
PS: Я не делаю ничего странного во время своих переходов. Я просто создаю переход и нажимаю следующую сцену. Я полагался, что SpriteKit позаботится обо всей уборке за меня.