SKEmitterNode излучает частицы до моделирования физики

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

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

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

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

ОБНОВЛЕНИЕ
Сначала у меня был эмиттер в качестве дочернего узла проигрывателя, а потом я заметил проблему.
Я также пытался синхронизировать позицию эмиттера точно с позицией игрока, без учета расстояния, пройденного с момента последнего обновления (скорость * dt), та же проблема.

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

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


Вот цикл кадров из документации Apple введите здесь описание изображения


person Ovidiu    schedule 05.11.2014    source источник
comment
Каков твой вопрос? Вы ищете альтернативы своей реализации?   -  person rickster    schedule 06.11.2014
comment
После еще нескольких тестов и просмотра ответа @ 0x141E я обнаружил некоторые проблемы с моим обходным путем. Например, когда игрок полностью останавливается (после путешествия на высокой скорости) из-за столкновения с другим объектом, некоторые частицы генерируются за пределами точки, где остановился мой игрок.   -  person Ovidiu    schedule 06.11.2014


Ответы (2)


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

person 0x141E    schedule 05.11.2014
comment
Я попробовал оба ваших предложения. Проблема в том, что частицы уже сгенерированы, когда он достигает обратного вызова didSimulatePhysics, поэтому просто установка позиции на позицию игрока в этот момент не помогает. Я знаю, что то, что я сделал, является оценкой следующей позиции игрока, однако это хорошая оценка из того, что я видел. - person Ovidiu; 06.11.2014
comment
Если игрок движется так быстро, что обгоняет своих детей, вы, вероятно, выходите за пределы того, с чем может справиться набор спрайтов. - person 0x141E; 06.11.2014

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

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

person rickster    schedule 05.11.2014