Правильно настроить поведение камеры в классическом 2D-платформере не так просто, как может казаться.
Самый простой подход — жёстко привязать камеру к персонажу игрока, чтобы он всегда находился в центре экрана. Это может сойти для прототипов, но такая камера обладает недостатками, которые сильно раздражают игроков.
Например, если камера сдвигается вверх при каждом прыжке персонажа, то это запросто может вызвать тошноту. Кроме того, при мгновенном разгоне и остановке персонажа камера может резко дёргаться.
В нашей новой игре Tiny Thor мы экспериментировали с различными вариантами. Я хочу рассказать о том, на каких техниках мы в результате остановились.
Во-первых, мы обрабатываем оси X и Y независимо друг от друга.
Скроллинг по оси X
Для оси X мы задали левую и правую границы (область Focus на скриншоте).
Когда игрок движется, камера вычисляет расстояние между предыдущим положением камеры и новым положением игрока. Таким образом мы узнаём, на сколько пикселей нужно выполнить скроллинг. Чтобы сгладить это двиение, мы делим это расстояние на 32, чтобы камера немного отставала. Также у нас есть максимальная скорость камеры, которая никогда не превышается.
Различные зоны камеры
Чтобы избежать срабатывания камеры при каждом мелком движении, мы применяем скроллинг только если персонаж выходит из левой или правой границы зоны фокуса. При этом камера сразу же его догоняет.
Из-за этого запаздывания камеры видимая область в направлении взгляда игрока уменьшилась. Это снижает объём важной информации на экране, необходимой игроку, чтобы реагировать на врагов, препятствия, платформы и т.д.
Чтобы решить эту проблему, мы перемещаем горизонтальную зону фокуса на основании ориентации спрайта персонажа.
Теперь камера смотрит в том же направлении, что и игрок
Когда игрок движется вправо, зона фокуса сдвигается влево, благодаря чему персонаж остаётся слева от центра экрана.
С увеличением скорости персонажа по оси X сдвигаем зону фокуса ещё дальше от центра. Благодаря увеличившемуся видимому расстоянию игрок может реагировать на сложности уровня.
В результате мы получили плавные движения камеры, адаптирующиеся к следующим действиям игрока, избавили его от раздражения и обеспечили бОльшую свободу в дизайне уровней.
Скроллинг по оси Y
Скроллинг по оси Y следует похожей логике и использует верхнюю и нижнюю границы зоны фокуса.
Вместо того, чтобы делить разность между координатами персонажа и камеры на 32, мы используем делитель 16 для эффекта сглаживания. Более того — камера начинает двигаться только тогда, когда персонаж стоит на объекте, чтобы она не следовала за каждым прыжком.
Камера начинает скроллинг по оси Y как только у персонажа под ногами оказывается земля.
Камера не перемещается по оси Y, когда игрок прыгает.
Поведение камеры по осям X и Y в действии.
Кажется, что для обычных случаев таких правил достаточно, но если игрок прыгает рядом с верхней частью экрана или падает в пропасть, то поведение камеры «ломается».
Чтобы решить эту проблему, мы добавили ещё две горизонтальные линии, проверяющие вертикальное положение персонажа. Мы называем их «линиями паники» (на иллюстрациях выделены тёмно-жёлтым цветом), потому что их пересечение приводит к быстрому движению камеры.
Поэтому когда персонаж прыгает или падает и пересекает одну из этих линий, камера быстро начинает следовать за ним.
Камера догоняет персонажа, как только он пересекает линии паники.
Всё это отлично работает в большинстве ситуаций на наших уровнях, но в некоторых случаях нам нужно вручную переопределять такое поведение.
Мы реализуем это с помощью простых прямоугольников в редакторе уровней, позволяющих заблокировать камеру по одной из осей, пока персонаж находится в заданной области.
Это очень полезно, когда нужно показать игроку, что падение с края платформы безопасно.
Также эту функцию можно использовать в беспорядочных областях уровней, которые в основном ориентированы в одном направлении, например, при падении вниз в глубокой пропасти, заполненной драгоценностями.
Также мы используем эту логику для блокировки камеры в битвах с боссами, когда игрок всё равно заперт на экране, а стабильная камера помогает ему избегать всех атак и выстрелов.
Ещё одним примером использования является полное переключение фокуса камеры на другую часть уровня. Логика здесь заключается в том, что камера пролетает по линии между положением персонажа и нужной областью, останавливается там на секунду и снова возвращается назад. Мы используем её, например, для демонстрации последствий использования выключателя.
Всё это позволило нам получить динамическое поведение камеры, без проблем работающее 95% времени, и дающее нам инструменты ручного задания поведения камеры в тех 5% ситуаций, которые нужны в геймплее или для драматического эффекта.
Об авторе
Йохен — основатель независимой игровой студии Asylum Square, занимающейся играми в ретростиле, который мы так любили в детстве. Вдохновлённый играми 16-битной эры платформер Tiny Thor будет скоро выпущен в Steam.