2014-10-14 4 views
0

В моей игре SK У меня есть ракеты, которые стреляют, и каждый получает SKEmitterNode, что создает эффект дымовой тропы. Как только ракета попадает на что-то, я вызываю removeFromParent, и это также удаляет излучатель, который мгновенно удаляет дымовую дорожку. Я хочу, чтобы дымовая тропа придерживалась, пока частицы не рассеиваются.Сохранение частиц после уничтожения излучателя

Я не понимаю, почему этого не происходит, даже если для targetNode установлено значение self.scene. Я взял узел эмиттера, создал массив со всеми его children и вызвал count до NSLog, сколько у него детей и вернулся ... ноль. Кажется, что все частицы должны быть детьми самой сцены, поэтому, когда излучатель удаляется со сцены, это частицы не должны быть, потому что это не дети.

Я пробовал много, много разных способов сделать это, и никто из них не работал.

Все, что я хочу для каждой ракеты, имеет излучатель, который оставляет дымовую дорожку, а когда ракета разрушена, дымовая тропа остается, когда она рассеивается. Но I не может позвонить removeFromParent на ракете, не разрушив его тоже!

+0

Вы можете вручную заставить дым рассеиваться. Идея состоит в том, что ... Ракета ударяет цель, задерживает задержку, уменьшает количество испущенных узлов, задерживает силу, уменьшает количество испускаемых узлов, повторяет до тех пор, пока не будет желательным, а затем удалит излучатель. Вы достигнете этого с чередой skactions. Я могу добавить ответ с кодом через час или около того, если вы заинтересованы в этом подходе. Это не потребует большого количества кода. – meisenman

+1

Сделайте emitterNode собственностью ракеты. Добавьте излучателя в качестве ребенка на сцену. Когда ракета взрывается, удалите ракету.В качестве альтернативы, держите излучатель в качестве ребенка ракеты и просто установите альфа-ракету на 0, что делает ее полностью прозрачной, а затем удалите ракету после рассеивания излучателя. – prototypical

+0

Первый подход все равно не создаст рассеивающего эффекта. Второй подход также не создаст эффект рассеивания (он будет иметь тот же эффект, когда частицы просто исчезнут при удалении излучателя), а также оставит вашу ракету восприимчивой к контактам и столкновению, если вы не измените категориюBitMask. – meisenman

ответ

0

Я, наконец, понял, как это сделать, но это заняло некоторое время, и некоторые вещи я до сих пор не совсем понял. Однако он работает.

Мне пришлось создать несколько излучателей. Мой гелий может стрелять в X количество ракет, прежде чем перезагружать (что занимает некоторое время), поэтому я создал столько излучателей, сколько iVars. Поэтому каждая ракета имела бы свой собственный излучатель.

Still, Я не мог добавить излучатель в качестве ребенка ракеты, иначе он был бы разрушен, когда была ракета. Таким образом, в моем методе обновления я создал оператор switch. Я создал новый iVar int, чтобы держать индикатор, для которого использовался эмиттер. В каждом переключателе case я бы сказал Sprite Kit взять этот эмиттер и поместить его прямо за ракетой.

Таким образом, всякий раз, когда ракета находилась в полете, инструкция switch проверила, какой эмиттер должен быть «прикреплен» к ракете и обновлять ее положение в каждом кадре. Конечным результатом является излучатель, который остается прикрепленным к ракете, но не является ребенком.

Затем, в моем методе didBeginContact, я уничтожаю ракету при контакте и сообщаю ее эмиттеру, чтобы остановить излучающие частицы (с setNumParticlesToEmit:1).

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

Наконец, мне пришлось resetSimulation на каждом ракетном обстреле, чтобы не сразу появилась большая дымовая тропа.

Вот как я получил его на работу.