Обновление SpriteKit позиции узла вызывает сбои в анимации

#swift #sprite-kit

#swift #sprite-kit

Вопрос:

Я следовал этому руководству, чтобы создать базовую платформерную игру. Однако я заметил, что обновление позиции foregroundNode ‘s в update функции приводит к тому, что анимация становится далеко не гладкой. В частности, этот фрагмент кода (на данный момент я реализовал только слой переднего плана):

 if (avatarNode.position.y - foregroundNode.position.y) > 0 {
    foregroundNode.position = CGPoint(x: 0.0, y: -(avatarNode.position.y - 200.0))
}
  

Вот gif того, что я вижу на своем устройстве. Обратите внимание, как зеленый квадрат дрожит вертикально, когда он подпрыгивает. Странно то, что мой fps остается постоянным ~ 60 кадров в секунду.

введите описание изображения здесь

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

Редактировать: вот мой исходный код.

Комментарии:

1. На сколько пикселей перемещается зеленый квадрат одновременно? Это 200? Попробуйте выполнить SKAction, чтобы переместить его в новую позицию, чтобы он не «прыгал» там.

2. @SteveIves да, он прыгает примерно на 200 пунктов за раз. Оценка в левом верхнем углу определяется количеством очков, которые он перемещает! Давайте попробуем использовать skaction! Сначала мне нужно разобраться, как это работает

3. ХОРОШО — вам, вероятно, понадобится SKAction moveBy , если я правильно помню.

4. @SteveIves вместо того, чтобы добавлять импульс, я вместо этого сделал avatarNode.run(SKAction.moveBy(x: 0, y: 200, duration: 0.2)) . Это не устранило проблему с сбоями. Я что-то упустил?

5. Не имея возможности видеть весь ваш код, я не уверен. Выглядело ли движение как-то иначе? Вы можете изменить длительность (перемещения SKAction) на что-то вроде 1 с, просто чтобы определить, выглядит ли это плавно (т. Е. 200 точек за 0,2 с — это слишком быстро) или, возможно, SKAction не работает или выполняется должным образом.