2014-11-05 2 views
0

У меня есть SKEmitterNode, сосредоточенный на моем плеере, чтобы оставить след частиц. У моего игрока есть физическое тело, и он перемещается по физике, а не вручную обновляет его положение.SKEmitterNode, испускающий частицы до физики, имитируется

Проблема, с которой я сталкиваюсь, заключается в том, что когда скорость моего игрока увеличивается, частицы испускаются из точки за игроком. Я обнаружил, что это происходит потому, что частицы испускаются в части «оценивать действия» цикла кадров. Затем мой плеер перемещается частью «имитировать физику».

Решение, которое я нашел в качестве обходного пути, заключается в перемещении SKEmitterNode (в обратном вызове) до точки, где мой игрок будет после вычислений физики. Это код, который я использовал:

particleEmitter.position = CGPointMake(
    player.position.x + player.physicsBody!.velocity.dx * dt, 
    player.position.y + player.physicsBody!.velocity.dy * dt 
) 

UPDATE
На первом у меня был эмиттер в качестве дочернего узла игрока, то есть, когда я заметил эту проблему.
Я также попытался синхронизировать положение излучателя точно в положение игрока, не учитывая расстояние, перемещенное со времени последнего обновления (скорость * dt), та же проблема.

Вопрос в том, какой был бы правильный способ решения этого вопроса?

UPDATE 2
Я создал площадку, демонстрирующую проблему. Здесь у меня есть эмиттер, как ребенок игрока. Чем больше вы увеличиваете скорость игрока, тем больше разрыв между игроком и испускаемыми частицами.
https://github.com/ovidiupruteanu/SKEmitterNodeTest-Playground


Вот цикл кадр из яблок Docs enter image description here

+0

Что вы думаете? Вы ищете альтернативы вашей реализации? – rickster

+0

После нескольких тестов и просмотра ответа @ 0x141E я нашел некоторые проблемы с моим обходным решением. Например, когда игрок достигает полной остановки (после путешествия с высокой скоростью), сталкиваясь с другим объектом, некоторые частицы генерируются за пределами точки, где мой плеер остановился. – Ovidiu

ответ

0

Ваш код только оценивает следующую позицию игрока. Он не учитывает другие факторы, которые могут повлиять на положение игрока, такие как столкновения, силовые поля, линейное демпфирование и т. Д. Я предлагаю вам установить положение эмиттера на позицию игрока в обратном вызове didSimulatePhysics или добавить эмиттера в качестве ребенка игрока ,

+0

Я попробовал оба ваших предложения. Проблема в том, что частицы уже генерируются, когда они достигают обратного вызова didSimulatePhysics, поэтому просто установка позиции на позицию игрока в этой точке не помогает. Я знаю, что я сделал, это оценка следующей позиции игрока, однако это хорошая оценка того, что я видел. – Ovidiu

+0

Если игрок движется так быстро, что он опережает своих детей, вы, вероятно, превысите пределы того, что может справиться с комплектом спрайтов. – 0x141E

0

Вместо того, чтобы вручную перемещать эмиттер на каждый кадр, пусть SpriteKit сделает это для вас: сделайте излучатель дочерним узлом игрового спрайта, а точка эмиттера останется в том же месте относительно игрока, когда игрок движется.

Если вы идете по этому маршруту, у вас может возникнуть проблема с выброшенными частицами, которые также следуют за игроком способами, которые вам не нужны. Вы можете решить эту проблему, установив targetNode эмиттера на узел, содержащий плеер.

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