Spritekit как не отклоняться от

#sprite-kit

#sprite-kit

Вопрос:

Я создаю игру-лабиринт в стиле pacman. Я могу применить импульс и ограничить его любым вертикальным или горизонтальным направлением по желанию героя.

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

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

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

1. Насколько важно для вас использовать физику для перемещения, а не просто перемещать узел героя?

2. Я понимаю, что вы говорите, но мне нужно, чтобы он двигался в одном направлении, пока не укажет другое направление или не ударится о стену и не остановится.

Ответ №1:

Итак, решение здесь немного противоречит интуиции. Вместо того, чтобы использовать applyForce: или applyImpulse: семейство методов для физического тела, используйте runAction:forKey: для самого спрайта. Для любого изменения направления removeAction:forKey: непосредственно перед вызовом runAction:forKey: чтобы все оставалось ортогональным. (В противном случае произойдет короткое угловое движение)

Другой трюк здесь заключается в том, чтобы найти подходящую скорость для расстояния. Слишком быстро, и он пролетит сквозь стены. (Ошибка?) Затем примените скорость и расстояние с множителем, основанным на размере вашей сцены. Общее расстояние должно быть чем-то большим, чем возможно в любом направлении. Это заставляет объект двигаться, пока он не упрется в стену или вы не скажете ему двигаться в другом направлении.

Это работает очень хорошо.

Используя физическое движение тела, оно лучше всего подходит для платформерной ситуации, когда у вас есть гравитация.

При просмотре сверху вниз обычно нет гравитации. (хотя можно себе представить, что вам может понадобиться что-то, что оказывает гравитационное воздействие на спрайт, чтобы всасывать его)