Создание графики в старых играх
Современный софт дает огромный набор инструментов для создания игр, а современное железо позволяет без проблем хранить десятки гигабайт одной игры и запускать тонны неоптимизированного кода. Впрочем, так было не всегда. Когда-то отсутствие графических процессоров и звуковых плат было нормой, и разработчикам приходилось проявлять фантазию.
Для примера рассмотрим Commodore 64, поскольку именно на этом компьютере был использован наиболее популярный принцип создания изображений. Такая машина обладала оперативной памятью 16 или 32 килобайта. Имелось и более мощное железо, но это была редкость. Разрешение было 320 на 200 пикселей, это 64000 точек на экране. Если каждый пиксель будет только черным или белым, потребуется около 8 килобайт оперативной памяти. А ведь нужно не только показать картинку, но и оставить память для обработки программного кода.
А теперь возьмем 16 цветов для каждого пикселя, получим 32 килобайта оперативы – это могли бы вытянуть только мощные процессоры в 64 килобайта. И это мы еще не рассматриваем разрешение 640 на 480 пикселей!
Тайловая графика
Этот графический метод был не единственным, но он был более распространен и в дальнейшем заимствован и адаптирован для игровых консолей вроде NES (Nintendo Entertainment System) и улучшен для консолей последующего поколения.
Суть тайловой графики заключается в том, что экран делится на ячейки размером 8 на 8 пикселей. Каждый пиксель получает свой цвет, но в пределах ячейки 8 на 8 можно использовать всего 2 цвета. На примере ниже можно видеть, как это выглядит. Используя разрешение 320 на 200 точек и 16 цветов, можно задействовать не 32 килобайта памяти, а всего 9 – 8 килобайт на отображение каждой ячейки 8 на 8 и еще 1 килобайт на то, чтобы ее раскрасить.
Но тут возникает несколько проблем. Координаты ячеек фиксированные, что не позволяет двигать картинку плавно. При перемещении персонажа из одной ячейки в другую анимация будет рваной. Можно было бы использовать костыли в пределах одной программы, но нужно было универсальное решение.
Для увеличения количества цветов был придуман оригинальный способ. Размер каждой ячейки уменьшался до 4 на 8, при этом сама ячейка оставалась квадратной для пользователя. Это происходило за счет того, что соседние пиксели по горизонтали шли парами и потому должны быть строго одного цвета. Сэкономленная память шла на увеличение числа отображаемых цветов с 2х до 4х. При этом количество цветов также увеличивалось с 16 до 256.
Этот режим используется в играх чаще описанного ранее. Мелкий текст в таком случае может смотреться, как нечитаемое месиво, но в играх количество цветов было важнее текста.
А еще такой способ позволял создавать красочные изображения с плавным переходов цветов.
Спрайтовая графика
Описанный выше алгоритм позволяет заполнить экран квадратными блоками, которые находятся вплотную друг к другу, но это не позволяло плавно двигать по экрану отдельные картинки. Чтобы обойти это ограничение, нужно было что-то придумать. Хорошим решением были спрайты. Тут проще пояснить напримере.
Сначала нарисуем изображение размером 8 на 8. Пусть это будет противник из Space Invaders. Каждый пиксель спрайта либо отображается (1), либо является прозрачным (0). Теперь зашифруем каждую строку в одно число. Такое изображение действовало независимо от тайлов, формирующих фон, и рисовалось поверх них.
За счет своей гибкости спрайты активно использовались в играх. Commodore 64 позволял отображать до 8 спрайтов на экране одновременно. Nintendo имела ограничения в 64, но их размер был серьезно ограничен. Если Commodore 64 позволял отображать спрайты разного размера, то Nintendo ограничивала их до 8 на 8 пикселей.
Возьмем для примера игру Super Mario Bros. Можно было бы нарисовать спрайтовую монету, она как раз имеет размер 8 на 8, но сам Марио большего размера – 16 на 16. Его изображение было склеено из 4х разных спрайтов, которые соединили в одну картинку. Луиджи был набором точно таких же спрайтов и склеен точно так же, но покрашен в другой цвет. Теперь ответ на вопрос, который я задал в самом начале – из скольких спрайтов состоят Марио и Луиджи? Ответ – это 8 уникальных спрайтов на всех, а не 1 и не 3, как многие могли бы подумать.
И раз уж мы заговорили про Нинтендо, то рассмотрим их знаменитую консоль поближе. Тем более, что именно она чаще всего упоминается, когда речь заходит о ретро-графике. Но перед этим еще один вопрос.
Nintendo Entertainment System
Я уже описал, что алгоритм прорисовки графики в NES несильно отличался от алгоритма в Commodore 64. NES обладала разрешением 256 на 240 и имела не только микропроцессор для обработки программного кода, но и даже собственный графический процессор. Правда, виртуальная память была дорогой. Графической памяти все еще катастрофически не хватало, поэтому ее нужно было оптимизировать.
Спрайты находились в так называемой графической таблице. Графический банк памяти каждой игры мог иметь только одну такую таблицу фиксированного размера. Более дорогие картриджи имели несколько банков памяти, что позволяло переключаться между ними и таким образом хранить несколько графических таблиц. Это позволяло делать больше визуального разнообразия, например, больше врагов и декораций.
Внимательные читатели уже поняли, что чего-то не хватает для отображения картинки по алгоритму, который я описал ранее. Это правда. Цвета не содержатся в банках памяти, а задаются игрой непосредственно в момент прорисовки.
В NES имеется 4 активные цветовые палитры, в каждой из которых содержится по 3 цвета. Поначалу может показаться, что лучше хранить 4 цвета, ведь это даст больше гибкости, но это не так. Каждый спрайт, хранящийся в цветовой палитре, имеет указания на 4 цвета, где 3 цвета прорисовываются самой игрой, а последний цвет фиксированный прозрачный – это отсутствие цвета.
Каждый спрайт мог получить комплект цветов одной из 4х палитр, и хотя палитры могли переключаться в процессе игры, это все равно ограничивало число цветов на экране.
Еще один интересный момент экономии памяти. Давайте посмотрим на кусты и облака в Super Mario Bros. Можно заметить, что они имеют схожие формы. Облака – это те же кусты, только с несколькими дорисованными тайлами снизу и имеющие ссылку на другую цветовую палитру.
Я уже писал, что консоль от Нинтендо могла показывать максимум 64 спрайта на экране, и что многие персонажи состояли минимум из 4х спрайтов (маленький Марио) или даже 8и спрайтов (Саймон Бельмонт, большой Марио). В самом начале игры Castlevatia восьмиспрайтовый Саймон встречает трех таких же восьмиспрайтовых зомби, итого 32 спрайта из 64х уже израсходованы, а это только главный герой и 3 врага на экране.
А есть еще всякие бонусы, подсвечники, хлыст Саймона, даже буквы и цифры – это спрайты. Как же быть с огромными боссами в пол-экрана?
На отображение большого противника никаких спрайтов не хватит, поэтому разработчики пошли на хитрость. Огромные боссы в играх являются частью фона, а движение босса при необходимости происходит прокруткой фона с одновременным смещением спрайта главного героя относительно фона. Если в бою фон экрана становится черным, то знайте, это для того, чтобы скрыть этот трюк.
Кстати, о прокрутке экранов. Да, это еще один интересный момент. Уровни загружались не полностью. NES имела возможность хранить только два экрана. Область просмотра определяет, какую область отображать, и может плавно перемещаться по горизонтали. Она больше походила на втулку и была закольцована, поэтому когда экран достигал конечной позиции, он плавно перемещался в начальную. Новые части уровня плавно прорисовывались за пределами видимости поверх уже ненужных частей.
Есть еще интересный трюк, связанный с отображением уровней. Горизонтальные линии могли прокручиваться с разной скоростью. Это позволяло двигать верхние части уровней медленнее, чем нижние, создавая эффект глубины. В некоторых играх сверху отображалась полоска статуса.
Параметры в рамке были обычной частью уровня, только, в отличие от самого уровня, они не прокручивалась, а оставались на месте.
А вот вертикальная прокрутка была ограничена. Она была возможна, и экран тоже был закольцован, но это был один экран в высоту. В Super Mario Bros, если Марио подпрыгнет и достанет головой верхней части экрана, когда внизу противник будет падать в бездонную пропасть, то произойдет столкновение.
Другой пример – это игра Chip & Dale: Rescue Rangers, которая в целом была весьма сырая. В ней не было боссов на некоторых уровнях, и были технические проблемы. На уровне F надо было двигаться вверх по трубам. Можно увидеть внизу оранжевую полоску – это криво отображенная труба в верхней части экрана – картинка от одного объекта, а палитра от другого.
Хватало немало игр с вертикальной прокруткой, в которых все работало, но реализовано это было не так, как с горизонтальной.
Тут пришло время ответить на другой вопрос, который я задал ранее. Что не так со спрайтами Мегамужика? Внимательные люди заметили подвох – для приросовки персонажа используется 4 цвета при лимите в 3. Такому персонажу потребуется минимум 8 спрайтов для силуэта, если максимально ужаться. Лицо Мегамужика является отдельным спрайтом, который накладывается поверх спрайтов его костюма.
Четвертое поколение консолей
Больше всего четвертое поколение запомнилось по игровым консолям Super Nintendo и Sega Megadrive (в Америке известная как Sega Genesis). Все знают, что это консоли с более продвинутым 16-битным процессором, а также с более мощными объемами памяти. Это позволило увеличить разрешение и отображать больше цветов в самих спрайтах, но это было далеко не все.
Super Nintendo имела 8 режимов для отображения фонов. Разница была в количестве слоев и цветов, которые можно было задействовать, но самым известным был новаторский режим 7. Он давал всего один слой для отображения, но позволял его масштабировать по каждой оси и даже вращать.
Самым впечатляющим эффектом, пожалуй, является эффект перспективы. Для его создания фон сжимался по вертикали, а затем каждая линия масштабировалась по-своему – дальние линии сжимались сильнее, чем ближние. Это часто использовалось в гонках, а также в отображении глобальных карт в Final Fantasy и не только.
Другой возможностью были схватки с боссами, окруженными массой спецэффектов. Например, голем из Super Castlevania IV. Это не спрайтовый противник, а часть фона, который масштабируется по мере получения урона. Обратите внимание на черный фон. Масштабировать спрайты консоль не могла, но могла заставлять игрока думать, что такое возможно.
Sega не хотела отставать от конкурентов. У консоли не было режима 7, но было, чем это компенсировать. Консоль имела возможность деформировать отдельные тайлы фона, что было использовано на полную катушку в некоторых играх, например, в Castlevania: Bloodlines. Шатающаяся Пизанская башня была получена путем смещения фона одновременно в горизонтальном и в вертикальном направлениях.
Другой интересной возможностью в консоли от Sega был фон на переднем плане. Это позволяло прорисовывать статичные изображения, которые отображались поверх спрайтов. Что-то подобное можно было видеть еще в играх на NES, но там эти трюки были созданы с помощью костылей, здесь же такая возможность была заложена самой консолью.
Еще одним новшеством в Sega Megadrive/Genesis было переключение цветов прямо в момент прорисовки кадра. Изображение на экране рисовалось сверху вниз. В процессе игра могла переключить палитру, использовав другие цвета для нижней части, нежели для верхней. Это позволяло задействовать больше цветов на экране при том же количестве использованных палитр.
Чаще всего такая технология применялась для воды и водных эффектов.
Super Nintendo имела схожие возможности, однако использовались они гораздо реже. Ни для кого не секрет, что начинка консолей от Нинтендо всегда была более слабой по сравнению с консолями от других крупных производителей. Низкую мощность Нинтендо издавна любила компенсировать оригинальными и в дальнейшем даже уникальными возможностями в своих играх. В общем, выяснять, какая из консолей лучше, занятие бессмысленное.
Следующий шаг – консоли пятого поколения и полноценная трехмерная графика, но это уже отдельная тема.