Я создал SKEmitterNode для прикрепления к моему плееру после его смерти. Это очень простой дым. Проблема в том, что это сбой игры, когда я либо: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 на спрайте игрока и запуск «removeFromParent» на нем сам перед тем, как перейти к сценам.
override func removeFromParent() {
self.deathSmokeEmitter?.removeFromParent()
//self.deathSmokeEmitter?.targetNode = nil
super.removeFromParent()
}
После выполнения этого аварии будет происходить только тогда, когда ВОЗВРАЩЕНИЕ на главном экране, а затем переходит обратно на игровой сцене. Это означает, что я могу делать быстрые повторы снова и снова столько раз, сколько хочу, если это прокомментировано, но оно все равно падает, если я вернусь на домашнюю сцену и вернусь к игровой сцене. Кроме того, когда он выходит из строя таким образом, трассировки стека показывает этот последний метод перед сбою:
[SKEffectNode dealloc]
Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи и спасибо!
PS: Я не делаю ничего странного во время моих переходов. Я просто создаю переход и нажимаю следующую сцену. Я полагался на SpriteKit, чтобы позаботиться обо мне всю уборку.
Возможно, стоит посмотреть на утечки памяти в инструментах. Ошибка, которую вы получаете, является результатом попытки доступа к переменной, которой нет. –
Есть ли какие-нибудь руководства для этого? Мне никогда не приходилось, и интерфейс UI довольно неинтуитивный. Я действительно не мог найти хороших гидов, которые говорили: «Это то, как вы точно определяете утечки памяти и исправляете их». – lespommes
Несколько дней назад я использовал учебник на [raywenderlich.com] (http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode), и это помогло мне найти пару утечек Я не ожидал вообще.Это несколько лет, но, следуя шагам для вашего проекта, нужно немного помочь. –