Когда-то мы писали о том, как создавали и оптимизировали старые игры для приставок. Теперь взглянем на это с другой стороны: как на слабом железе создать очень интересную и визуально богатую игру. Что делать, если память почти закончилась, а нам нужны дополнительные персонажи? Ну и вообще как делали старые игры.
👉 Эта статья — краткий пересказ видео с канала Ars Technica, где создатель игры Джордан Мехнер делится историями о разработке игры. Если знаете английский, посмотрите видео в оригинале, а если нет — читайте дальше:
Каратека
До «Принца Персии» Джордан создал «Каратеку» — игру для компьютера Apple 2. Смысл такой: игрок играет за персонажа-каратиста, который движется вперёд и сражается с другими каратистами на своём пути. Сложность разработки была в том, что у большинства пользователей Apple 2 было всего:
- 16 килобайт оперативной памяти на всё, включая работу операционной системы и служебных программ;
- 4-цветный монитор с разрешением 140 на 192 пикселя;
- процессор на 1 мегагерц — это в несколько тысяч раз меньше, чем у самого простого нынешнего офисного ноутбука.
Успех «Каратеке» принесла относительная реалистичность анимации персонажей: они довольно точно повторяли движения настоящих каратистов, и для того времени и железа это выглядело круто.
Чтобы достичь такого эффекта, разработчики использовали тот же приём, что и аниматоры в рисованных мультфильмах: они снимали на видео движения людей в той же ситуации, потом раскладывали видео на ключевые кадры — как раз за разом меняется поза героя. Дальше они отрисовывали эти кадры на компьютере и получали довольно естественную анимацию.
Движения персонажей в «Принце Персии»
В начале работы над «Принцем Персии» у Джордана была похожая задача: нужна была анимация не просто бега или простых ударов, а полноценная механика для препятствий. Например, игрок должен уметь перепрыгнуть через ров, залезть на выступ или подлезть под воротами.
Джордан применил тот же подход, что и в «Каратеке», но вывел его на новый уровень: он позвал своего брата и попросил выполнить его все трюки, которые будут в игре у персонажа. Каждый трюк, от простого бега до длинных прыжков с разбега, Джордан снимал на камеру:
После этого он сделал то же самое, что и в «Каратеке», но с большей тщательностью: разложил каждый трюк на кадры, отрисовал их и превратил в кадры для анимации на компьютере:
Но проблема была ещё в том, что нельзя было оцифровать каждый кадр — если делать анимацию с той же раскадровкой, что и на плёнке, то понадобится много памяти, чтобы отрисовать каждое промежуточное движение. Пришлось выбирать, какие кадры из анимации выкинуть, а какие оставить. Так удалось сократить каждое движение до нескольких фреймов и сохранить реалистичность:
А вот что получилось в итоге после оцифровки анимации:
Как сделать ещё одного персонажа, когда не хватает памяти
Изначально в «Принце Персии» не было врагов — игрок должен был просто пройти все подземелья и ловушки, чтобы добраться до принцессы. Чтобы игра стала интереснее, разработчик решил добавить в неё противника.
Но проблема была в том, что новому персонажу нужны:
- Свой уникальный внешний вид, чтобы никто не перепутал его с кем-то ещё.
- Своя анимация движения.
- Своя логика работы и реакции на то, что происходит в игре.
Это всё требует дополнительных расходов памяти, которой и так было очень мало. Несколько месяцев Джордан не знал, как подступиться к решению, пока ему не подсказали решение: сделать нового персонажа на основе старого.
Решение придумали такое:
- Использовать битовую команду EOR (исключающее или), чтобы при наложении EOR-маски на модель игрока получить её контур — цветной по краям и чёрный внутри.
- Так как это просто маска, которая накладывается на модель игрока, то новую анимацию придумывать не нужно — достаточно будет на неё наложить ту же маску.
Во время разработки это выглядело так и заняло всего 4 команды:
Глядя на результат, разработчик понял, что у него получился как бы теневой двойник главного героя. Чтобы объяснить его внешний вид, Джордану пришлось придумать целую историю прохождения игрока через зеркало: в тот момент, когда герой проходит сквозь зеркало, с обратной стороны выходит тот самый теневой персонаж:
Чему это нас учит
По классике, «раньше программисты могли написать игру на 3 килобайта, и она игралась лучше, чем современные поделки». Но это старая сказка, так будут говорить всегда.
Интересно вот что: большая часть решений в этой игре — не программистская, а смысловая и художественная. На основании чего записать движения? Какие кадры выбрать? Что должно быть в сюжете? Это история о том, что программирование — это не столько знание синтаксиса, сколько решение творческих задач.
И, конечно, волшебный приём с исключающим «или» — у машин есть классные низкоуровневые команды, зная которые мы можем добиваться высокой производительности и интересных эффектов. Кто хорошо понимает компьютеры, тот может выжимать из них больше.