Да пребудет с вами прокрутка: теория и практика по камере в платформерах [1/2]
От переводчика. Статью написал Итай Керен, основатель инди-студии Untame, автор игры Mushroom 11. Получился настоящий учебник по управлению камерой в играх с боковой прокруткой. Хоть там нет ни строчки кода ни на каком языке (вру, одна есть), думаю, несложно будет перевести всё это в инструкции для компьютера. Обязательно к прочтению всем программистам и дизайнерам, которые занимаются динамичными 2D-играми. Терминологию я переводил больше по смыслу: например, position-locking — «привязанная камера». Да, и для многих игр до 1983 года показана версия для Dendy — немного неисторично, но простим.
ВведениеРаботая над игрой Mushroom 11, я натолкнулся на множество дизайнерских и технических вопросов. Я не рассчитывал, что кто-то напишет о вершинной анимации или плавном изменении формы, но я удивился, что по работе с камерой, задаче с 30-летней историей, тоже практически не пишут.
Я решил устроить небольшое путешествие по истории двухмерных игр, задокументировать их трудности, подходы и эволюцию их решений. У многих решений нет даже названия, так что я — скорее для себя — придумал классификацию подходов к камере и написал небольшой словарик.
ПрокруткаПрокруткой или панорамированием мы называем любую попытку показать сцену, которая не умещается на экране. Есть много вопросов, связанных с прокруткой: показать игроку то, что он должен видеть, показать то, что мы, как разработчики, хотим ему показать, и как сделать, чтобы всё это прокручивалось плавно и комфортно.
Хотя я сосредоточусь на двухмерных камерах, многие из этих общих концепций работают также и для 3D.
Кое-что из неврологииПрежде чем мы рассмотрим игры, давайте изучим наши органы чувств, чтобы лучше узнать зрение и восприятие. Так мы сможем понять, что в прокрутке бывает не так.
Центральная ямка — рецептор внутри нашего глаза, ответственный за чёткое и детальное центральное зрение. Второй и третий пояса рецепторов, парафовеа и периферия, великолепно сжимают картинку и движение, чтобы ускорить опознание — в первую очередь опознание знакомых тревожных форм и изменений в направлении и скорости движения.
Изображение с глаз идёт напрямик в миндалевидное тело, обеспечивающее быструю реакцию, и одновременно в зрительную кору, которая расшифровывает изображение. Мозг можно натренировать — например, «привязать» сдвиги на периферии зрения к управлению. Это полезно в играх.
Вестибулярный аппарат располагается в нашем внутреннем ухе, и отвечает за равновесие и пространственную ориентацию. Сигналы, которые он посылает, позволяют телу удерживать равновесие, в то время как глаза вглядываются в детали.
Когда некоторые, как я, читают в машине, ускорения, не подкреплённые зрительно, приводят к укачиванию и головокружению. Но верно и обратное: если периферийное зрение улавливает изменения в фоне, а вестибулярный аппарат говорит, что всё неподвижно — вы же сидите у компьютера — результат будет похожий.
Так что противоречивые сигналы с органов чувств (зрения и вестибулярного аппарата) могут привести к дискомфорту и укачиванию. Хотя в 3D (особенно в виртуальной реальности) эти эффекты ярче, это заметно и в двухмерных играх.
Внимание, взаимодействие и комфортЧтобы помочь понять вопросы прокрутки, я выделил в них три больших вопроса.
Внимание: научить камеру показывать достаточное количество игровой информации, чтобы ориентироваться в игре (то, что игроку надо увидеть).
Взаимодействие: сделать, чтобы игрок мог управлять тем, что камера видит, чтобы изменения в фоне были предсказуемы и чётко привязаны к управлению игрока (что игрок хочет увидеть).
Комфорт: облегчить и объяснить изменения в фоне (как сделать, чтобы эти задачи элегантно сочетались, не создавая игроку неудобств).
Скролл-ностальгияНачнём наше путешествие с самых 1980-х, когда разработчики изобретали новые игровые схемы, обходя такие технические ограничения, что 30 лет спустя трудно и представить, что они были.
Я буду ссылаться и на ведущие инди-игры, большей частью из последнего десятилетия, ведь они всегда демонстрировали новаторство, внимание к деталям и заботу, которые можно ожидать от независимых художников — и работа с камерой не исключение.
Вслед за действомВсё внимание — управляемому герою
Начнём с простейшего. В общем говоря, вы, как игрок, в полном ответе за своего персонажа. Это диктует то внимание, которое игра отдаёт герою, когда ведёт его камерой.
В начале 80-х прокрутка была сложным делом, и разработчик сталкивался с ограничениями: скорость процессора, ёмкость памяти и сегментная структура памяти. Но даже с этими проблемами выпускались замечательные прокручивающиеся игры, элегантно вписывающиеся в эти ограничения. Правда, зачастую движение было простейшим или рывками.
Одновременно виден ещё один несложный механизм, который я называю «упор в край» — когда камера упирается в край экрана, персонаж может уйти от точки привязки. Kung-Fu Master (Irem, 1984) Привязанная камера Упор в край: устанавливается жёсткий край, за который камера выйти не может. (Камера упирается в край почти во всех играх, так что больше этот приём упоминать не будем.) Привязанная камера — простейший приём, но всё ещё полезный. В песочнице с ремёслами Terraria персонаж очень мал по сравнению с экраном и прыгает невысоко, так что привязанная камера не только работает, но и даёт дальний обзор во всех направлениях. Terraria (Re-Logic, 2011) Привязанная камера
Ограничить движение камерыПоменьше ненужных или непредсказуемых прокруток
Как избежать прокрутки, если она нежелательна? 30 лет назад у прокрутки были недостатки: она была требовательна к процессору, потому что перерисовывался большой кусок экрана. И даже если удавалась её наладить, большие пиксели того времени делали прокрутку неплавной. Потому лучшим подходом было поменьше прокручивать. Один из способов — дать персонажу ходить в рамках некоторого окна, и прокручивать, если он выйдет за пределы окна.
Jump Bug многие считают первым платформером, хотя технически игрок прыгает постоянно, управлять нужно только высотой прыжка и движением влево-вправо. В ней, как и во многих других играх того времени, камера автоматически сдвигается вверх, требуя от игрока запрыгивать выше и выше, обходя преграды. Jump Bug (Alpha Denshi / Hoei → Coreland, 1981) Окно свободного хода: сдвигать камеру, как только игрок упрётся в край окна Окно свободного хода решило задачу, которая для многих разработчиков и не стояла, и поставило стандарт, за которым последовали тысячи платформеров. Но появились и свои вопросы: игрок, прыгающий выше и выше к выходу, слишком поздно замечает врага, приближающегося сверху.
В одной из моих любимых, Rastan Saga, можно двигаться по двум осям и ходить разными путями. И она — одна из первых, которая выработала взаимосвязь между камерой и механикой. Свободный ход такой же высоты, как стандартный прыжок, и прыжки не вызывают движение камеры вверх — если, конечно, Растан до этого не сдвинулся вверх. Это исключает потребность в рывках камеры.
Большой недостаток в этом — враги, появляющиеся сверху, плохо заметны, особенно если Растан и так где-то вверху свободного окна. А двигаться влево (что бывает во многих замках), вообще неудобно, слишком мало видно вперёд. Rastan Saga (Taito, 1987) Окно свободного хода Окно свободного хода всё ещё появляется в новых играх. Посмотрите, как в Fez горизонтальное окно сохраняется при развороте измерений. И, вообще-то, ось разворота выбирается такая, чтобы игрок оставался в окне. Окно свободного хода в Fez выбрано не совсем обычное, и это замечательное решение для столь уникальной игры, и мы это покажем позже. По вертикали это обычная привязанная камера с линейным сглаживанием — это мы объясним позже. Fez (Polytron, 2012) Окно свободного хода (по горизонтали, сохраняется при развороте измерений) Привязанная камера (по вертикали) Линейное сглаживание (курсивом выделены термины, определение которым дадим ниже) Географический ракурс Ручное управление (правым рычажком)
ВозвратВернём беглую камеру на место!
Мы уже показали, как окно свободного хода уменьшает движение камеры. Но, как мы видим в Jump Bug и Rastan, это имеет и недостатки, когда игрок у края окна. Вот один из способов исправить это.
Shinobi, наверно, моя любимая классическая игра, и в ней очень высокие прыжки по платформам. Дизайнеры устроили уникальное управление камерой: по вертикали, поскольку платформ много, есть очень широкое окно свободного хода. И, как обычно, Ниндзя упёрся в край окна — сразу тянем камеру. У высокого (или широкого) окна есть и недостаток: после небольшого прыжка игрок может застрять наверху окна, и сверху видно очень мало, как в Rastan Saga. А Shinobi медленно тянет камеру к игроку, удерживая всю гущу событий в кадре и сводя резкие движения камеры к минимуму. Shinobi (Sega, 1987) Возврат камеры (по вертикали): постоянно снижать «увод» камеры, подтягивая её к игроку. Окно свободного хода (по вертикали) Привязанная камера (по горизонтали) Статическое упреждение Одна из новых функций, придуманных в Super Mario World — платформенный возврат. Как и с любым окном свободного хода, камера стоит на месте, пока герой не упрётся в край. Но как бы Марио ни прыгал, он в конце концов приземлится на платформе, и когда это случится, подтянем камеру к нему. Super Mario World (Nintendo, 1990) Географический ракурс Платформенный возврат: камера возвращается к игроку, как только он приземлится на платформу. Окно свободного хода (по вертикали, срабатывает редко) Двойное упреждение (включается по порогу) Ручное управление (по горизонтали, дополнительными кнопками пульта) Это первое упоминание работ Миямото, и точно не последнее. Он понимает игру и внимателен к мельчайшим деталям — и потому он хороший гемдизайнер, а не только потому, что хорошо придумывает механику игр.
Эту же идею видим в самом первом Rayman. Верх экрана служит верхом окна свободного хода. Заметьте, камера не двигается, когда Рейман прыгает — она аккуратно подъезжает, когда он приземляется. Вот умное решение, ведь окно свободного хода немногим больше, чем высота прыжка. И снова перед нами пример, как игровая камера становится неотъемлемой частью дизайна игры. Rayman (Ubisoft, 1995) Платформенный возврат Окно свободного хода (по вертикали, срабатывает редко) Географический ракурс Двойное упреждение Линейное сглаживание Эта техника действует и сейчас, не давая камере сдвинуться во время прыжков и центрируя её, когда прыжок закончен — или когда вышли из зоны свободного хода. Естественно, платформенный возврат работает, когда персонаж может вставать на платформы. А если нет, как в реактивном ранце в Awesomenauts, работает только вертикальный свободный ход. Awesomenauts (Ronimo Games, 2012) Окно свободного хода (по вертикали) Платформенный возврат Привязанная камера (по горизонтали)
СглаживаниеИзбегать резких изменений в скорости камеры и направлении движения
Мы уже говорили о роли периферийного зрения и как оно влияет на зрительный комфорт. Давным-давно, когда мы были маленькими, а пиксели — большими, даже простое движение камеры выглядело дёргано из-за больших пикселей. Пиксель 80-х Dendy: разрешение 256×240 Современный инди-пиксель Содержит множество физических пикселей Как мы можем сгладить движение камеры, когда у нас строгая и грубая решётка крупных пикселей? Сейчас мы можем нарисовать прекрасную пиксельную картинку, а затем двигать её с точностью намного выше, чем разрешение картинки. А если не нужно быть «пиксель в пиксель», многие движки могут работать с шагом даже меньшим, чем пиксель.
Сглаживание (псевдо)физикой
Псевдофизика может помочь, когда надо сгладить обычную привязанную камеру (кое-кто скажет, что любая физика в движке на самом деле псевдо-).
Pac-Land — по утверждению некоторых, первый современный платформер. В нём много элементов, которые помогли определить жанр: прыгать по платформам, уворачиваться от врагов и подбирать бонусы. Насчёт сглаживания — скорость там от 0 пикселей/кадр поднимается до 1, 2, 3, и так до максимума, а затем так же плавно падает до нуля. Хотя камера привязана к Пакману, результат чёткий и плавный. Но Pac-Land не надо прокручивать по вертикали, а именно там основные сложности — в быстром ускорении и замедлении, когда прыгаешь и падаешь. Pac-Land (Namco, 1984) Привязанная камера Статическое упреждение
Сигэру Миямото
Здесь я бы хотел снять шляпу перед Сигэру Миямото и показать несколько первых его работ. Он сделал бесценный вклад в индустрию, и его влияние к мельчайшим деталям игры сложно преувеличить.
В 1984 году он начал экспериментировать с прокруткой, и разработал две игры, которые пользуются ею совсем по-разному. В обеих у игрока совсем мало контроля над прокруткой. Они скорее похожи на комнату с движущейся картинкой на стене. Excitebike (Nintendo, 1984) Devil World (Nintendo, 1984) В Северной Америке отказано в выпуске В Excitebike была современного вида прокрутка, зависящая от скорости мотоцикла. Достаточно плавная, но особенно на игру не влияла.
А в Devil World всё было построено на прокрутке. В этом клоне Pac-Man вы играете христианским драконом, который борется с дьяволом, а тот постоянно меняет направление прокрутки, отталкивая вас ближе к краю. Это единственная игра, которую так и не выпустили в США из-за религиозных образов, но, по сравнению с качеством других его работ, это небольшая потеря. Хотя познавательно — и зачастую вдохновляюще — увидеть первые, менее удачные работы мэтра. Даже лучшие художники экспериментируют, и не все эксперименты удаются.
А теперь перескочим на год вперёд. Трудно преувеличить блеск Super Mario Bros. Сама игра — простенькое движение слева направо по горизонтали. Да ещё она и не даёт ходить назад за край экрана, что нередко в платформерах (технически это можно определить как одностороннее окно свободного хода). Super Mario Bros. (Nintendo, 1985) Толкающая зона разгона: когда персонаж в зоне, постепенно ускоряем камеру, пока не сравняется со скоростью персонажа. Окно свободного хода (одностороннее) Статическое упреждение Если бы Марио отошёл назад для разгона, а затем со всей скорости вышел бы из окна свободного хода, за один кадр камера разогналась бы от 0 до максимума, с большой сменой в скорости прокрутки и неминуемым дискомфортом. Дизайнеры решили это, добавив ещё одну точку, в 25% от центра, где камера начинает разгоняться, чтобы сравняться скоростью с Марио. Так что, когда Марио должен упереться в край, камера уже гонится за ним на полной скорости.
Metroid был новаторской игрой, создавшей новый жанр, сочетающий прыжки с исследованием (в брате по жанру Castlevania, кстати, была простейшая привязанная камера).
Donkey Kong Country придумал много новаторских решений с камерой. Он был один из первых, кто сделал меняющееся упреждение (об этом позже), а также линейное сглаживание, которое сделало прыжки очень плавными. Donkey Kong Country (Rare / Nintendo, 1994) Линейное сглаживание: постоянно снижать расстояние между камерой и игроком по формуле линейной интерполяции. Привязанная камера (по вертикали) Географический ракурс Двойное упреждение Линейная интерполяция — не такое-то и большое достижение. Но именно эта формула стала стандартным инструментом, снижающим рывки камеры на скорости, особенно при прыжках.
float lerp (float a, float b, float t)
Это, пожалуй, самая эффективная и вездесущая методика сглаживания. Она работает и для медленных персонажей, и для таких быстрых, как Super Meat Boy. Только если персонаж большой и движется очень быстро, камера может и не нагнать его, и враги будут скрыты за кадром до последней секунды.
В этой несложной формуле глубокий смысл. Это решение дифференциального уравнения
при k > 0 в моменты времени t = 0, 1, 2, 3… Грубо говоря, скорость полёта пропорциональна расстоянию. Хочется сказать «камера висит на пружине», но задача с пружиной подразумевает ускорение (вторую производную).