2015-10-13 2 views
2

Я пытаюсь объединить мои узлы эмиттеров частиц. Я повторно использую их, когда они нужны, удаляя их со своего старого родительского узла и добавляя их в качестве дочернего элемента SKSpriteNode в новое место. Я оставляю положение узла эмиттера равным 0,0, поэтому эмиттер должен появиться в центре нового родительского спрайт-узла.Невозможно повторно использовать узел эмиттера с разными родителями в iOS9

Излучатели правильно отображают первый раз, когда они добавляются в качестве дочернего элемента в узел спрайта, но просто не отображаются при последующих попытках. Это все прекрасно работало в iOS8 и нарушается только в iOS9 (кажется, как много эмиттера частиц ошибок в iOS9?)

Вот простой пример моего кода, когда мне нужно поместить эффект частиц:

if emitter.parent != nil { 
    emitter.removeFromParent() 
} 

newLocationSpriteNode.addChild(emitter) 

emitter.resetSimulation() 

Это отлично работало в iOS8 - я мог бы повторно использовать свои эмиттерные узлы в новых местах. В iOS9 узлы появляются только при первом запуске этого кода и никогда больше не появляются. У вас есть представление о том, как я могу обойти эту проблему? Благодаря!

+0

может быть ошибка, которая была в 8, который был зафиксирован в 9, вы сбросе эмиттера частиц правильно? является ли эмиттер назначенным родительским сторонам? При сбросе ios 9 теперь останавливает излучатель, и вам нужно заставить его работать снова? Просто некоторые вещи, чтобы рассмотреть – Knight0fDragon

+0

Привет Рыцарь - спасибо за мысли. Поэтому я тестировал это с бесконечным эмиттером и без сброса и той же самой проблемы. На самом деле, похоже, вы даже не можете удалить излучатель частиц из узла, а затем снова добавить его в тот же узел. Как только вы удаляете излучатель частиц как дочерний узел узла, кажется, что вы никогда не сможете использовать его снова. – Stephen

+0

Вы получаете сообщение об ошибке или просто ничего не показывает? – Knight0fDragon

ответ

2

У меня возникла такая же проблема, как вы описали. Излучатели не были видны при повторном присоединении во второй раз. Тем не менее, все работает отлично на ios8. После нескольких часов экспериментов с разными настройками я почти сдался. Однако я нашел решение, которое работает сейчас. Прежде всего, у меня есть пул SKEmitterNodes, который я повторно использую во время игры. Этот метод захватывает эмиттер из пула (массив) и добавляет его в игровом слой (SKNode):

func createExplosion(position: CGPoint) { 

     let emitter = _pool.borrowDirtEmitter() 

     emitter.resetSimulation() //Important 
     emitter.position = position 
     emitter.targetNode = self //Important 

     if emitter.parent == nil { 
     self.addChild(emitter) 
     } 
    } 

Таким образом, «Я» здесь является фактическим узлом, который я придаю эмиттер. Когда узел закадровый я очистить излучатели (и другие объекты):

 if let dirtEmitter = childNode as? SKEmitterNode { 
      if dirtEmitter.parent != nil { 
       dirtEmitter.removeFromParent() 
      } 
      dirtEmitter.targetNode = nil //Important! 
      _pool.returnDirtEmitter(dirtEmitter) 
     } 

Я haven't было время, чтобы вдаваться в подробности пока, но «Важные» комментарии должны дать вам несколько советов. Я попытаюсь проверить подход, используя действие, которое нужно удалить из родителя (через х секунд), но поскольку я создаю боковой скроллер, я могу уйти с очисткой, когда излучатели сейчас находятся вне экрана.

Надеется, что это помогает ..

+0

Так что установка целевого узла на новый родительский узел перед добавлением в качестве ребенка, похоже, делает трюк? Я считаю, что targetNode определенно является одной из самых сложных вещей, которые я испытал в SpriteKit. Маркировка как ответ из-за отсутствия лучшего решения. Хорошая находка! Я переписал свой пул эмиттеров, чтобы просто добавить все к моему «мировому» узлу и переместить по мере необходимости некоторое время назад, но я рад, что там есть исправление. – Stephen

+0

Да, похоже, это так же, как и установка нуля, прежде чем вернуться в пул. Кажется странным. Рад слышать, что вам удалось найти обходной путь. – Tomas

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