2015-06-20 4 views
1

Я создал 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, чтобы позаботиться обо мне всю уборку.

+0

Возможно, стоит посмотреть на утечки памяти в инструментах. Ошибка, которую вы получаете, является результатом попытки доступа к переменной, которой нет. –

+0

Есть ли какие-нибудь руководства для этого? Мне никогда не приходилось, и интерфейс UI довольно неинтуитивный. Я действительно не мог найти хороших гидов, которые говорили: «Это то, как вы точно определяете утечки памяти и исправляете их». – lespommes

+0

Несколько дней назад я использовал учебник на [raywenderlich.com] (http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode), и это помогло мне найти пару утечек Я не ожидал вообще.Это несколько лет, но, следуя шагам для вашего проекта, нужно немного помочь. –

ответ

1

Итак, я узнал, как это исправить (я в значительной степени выяснил, когда задал вопрос), но для выяснения.

По какой-то причине SpriteKit в iOS 8 не удаляет излучатель дыма из спрайта игрока при переключении сцен. Это почему-то вызывает сбой, поскольку по какой-то причине он пытается сделать некоторую логику на нем в следующей сцене.

То, что у меня было выше, было почти правильным. Во-первых переопределить шприц с removeFromParent эмиттера частиц ребенком() метод, как это

// Sprite with ParticleEmitterNode child attached to it's method 
override func removeFromParent() { 
    self.deathSmokeEmitter?.removeFromParent() 

    super.removeFromParent() 
} 

Перед включения сцен, просто сделать spriteWithEmitterChild.removeFromParent(), чтобы удалить спрайты (с эмиттером, как ребенок) со сцены, который вызовет переопределенный метод и удалит излучатель дыма из спрайта, прежде чем удалять спрайт со сцены.

 Смежные вопросы

  • Нет связанных вопросов^_^