Famicom/NES/Денди: битва за Status Bar

На Famicom/NES/Денди было одно сильно аукнувшееся гейм–девелоперам упрощение/удешевление — вместо четырёх экранных областей объёмом 4Кб выстроенных квадратом между которыми был возможен бесшовный скроллинг (с прокруткой) в консоли оставили только 2Кб VRAM и, таким образом, было только две экранных области с бесшовным скроллингом.
Т.е. виртуальный задний фон мог бы иметь такую раскладку:

(глубже теорию вопроса можно изучить в статье про графическую архитектуру Famicom/NES)
Но в итоге оставались только две эффективных области из этих четырёх. Причём коммутацией линий картриджа их можно было выстроить как вертикально так и горизонтально (оставшиеся области «зеркалились»). Таким образом чисто вертикальные или чисто горизонтальные скроллеры реализовывались легко из коробки, но с произвольным скроллингом возникал целый ряд проблем которые решали кто как.


(так работает горизонтальный скроллинг в NES в играх типа Super Mario Bros «под капотом» (сверху — две соседствующие экранные области в VRAM, снизу — итоговое изображение)

Одной из таких проблем был «status bar» или панель с игровой информацией. Она создавалась техникой VBlank–отсечения — когда два фрагмента заднего фона разделённых по горизонтали могли иметь разные параметры скроллинга и таким образом один из них становился собственно панелью, а другой был игровым полем.
Например в игре Bomberman экранные области в VRAM могли «выглядеть» вот так (в отладчике эмуляторе FCEUX):

а на экране телевизора картинка была такой:

Здесь сверху еще наложены подвижные спрайты, но главное тут для нас то, что верхняя часть первой экранной области «приклеена» к верху экрана с параметрами прокрутки (0,0), в то время как нижнее игровое поле скроллится по горизонтали как бы независимо.

Тут довольно просто понять как реализуется панель информации если скроллер горизонтальный — «фиксируется» всё и так по горизонтали. Но вот что, если скроллер вертикальный? Две имеющиеся экранные области уже будут выстроены вертикально и «скользящее окно» будет двигаться по ним, например, снизу–вверх. Довольно быстро это окно упрётся в панель с информацией если она будет так же неподвижна как в Bomberman.

Решение тут очевидно — когда «скользящее окно» при скроллинге будет приближаться к экранной области где панель находится — её надо отодвигать, перерисовывая в другом месте.
На самом деле это довольно неприятная для Famicom/NES процедура, т.к. число байт которые можно успеть обновить в VRAM за кадр сильно ограничено, но в принципе такая задача ей по силам.
Выглядит это как то так:

Это вид экранных областей в эмуляторе FCEUX игры Contra Force — фрагмент уровня в подводной лодке.
Что тут важно — во первых экранные области зеркалированы по горизонтали, т.к. тут идёт вертикальный скроллинг.
Во вторых — по мере скроллинга (и прокрутки через вертикальные границы) мы видим как периодически копируются три или четыре строки с какой то пиксельной белибердой.
На самом деле это как раз и есть панель с информацией — просто игра при переключении на её вывод еще подменяет и тайлсет таким образом расширяя разнообразие выводимой информации.
В данном видео вывод отладочной информации настроен на тайлсет поля, так что панель с информацией выглядит как пиксельное месиво. Но это она.
Как видите при вертикальном скроллинге она постоянно вынуждена перерисовываться в новых местах экранных областей — так и получается бесшовный скроллинг вместе со status bar:

Однако эту технику с перерисовкой информационной панели многие программисты в своё время или не придумали или не стали реализовывать.

Как же они поступали?

CAPCOM

Вот, например, скриншот игры Capcom «1943: The Battle of Midway» 1987 года выпуска:

Ага! Вместо того, чтобы делать полноценную информационную панель игра просто выводит в левом–верхнем углу текущий score игрока спрайтами! Спрайты в Famicom/NES представляют из себя отдельный независимый от заднего фона слой изображения и до 64 спрайтов 8x8 могли быть помещены на экране куда угодно.
Но тут надо заметить, что Famicom/NES не могла отображать больше восьми спрайтов в одной строке изображения — остаток просто пропадал. А цифр по горизонтали тут могло быть весьма много.
Поэтому в такой знаменитой игре как Megaman (1987) программист(ы?) Capcom делают ход конём:

С одной стороны цифры score помещают как можно выше, чтобы было меньше коллизий со спрайтами монстров, а с другой стороны полоску жизней в левой–верхней части экрана располагают по вертикали, таким образом отнимая только по одному спрайту от возможных в этих строках. Довольно разумно.
Следует заметить, что эта методика будет использоваться в серии на Famicom/NES вплоть по самую последнюю часть — Megaman 6 (1993):


Посмотрим так же на следующие игры Capcom:

TaleSpin (1991):


The Little Mermaid (1991):


Darkwing Duck (1992):


Chip & Dale 2 (1993):


Как видно во всех них полноценный status bar отсутствует, а необходимая информация о жизнях выводится поверх игрового поля спрайтами!
Неужели программисты Capcom не научились тому как делать информационную панель?? :)
Не совсем так, хотя тенденция очевидна — кто–то там у них статус–бары и сопровождающие их техники сильно не любил.
Но есть как минимум одна известная игра–скроллер на Famicom/NES от Capcom где полноценная информационная панель с вертикальным скроллингом есть:


И то Duck Tales ажно 1989 года выпуска. Т.е. вроде как status bar был фирмой освоен задолго до всех вышеприведённых хитов.
Более того — в игре присутствуют моменты когда горизонтальный скроллинг, который легко с информационной панелью сочетается бесшовно сменяется вертикальным:

(начало нужного фрагмента на 1:30)
Но… так ли этот вертикальный скроллинг бесшовен?..
И вот тут некоторые из вас наверное вспомнят, что практически во всех этих играх Capcom фрагменты с вертикальным скроллингом были всегда немного странными — это были какие то переходные зоны (как вот верёвка в Duck Tales) и герой терял способность управлять собой во время этого скроллинга.
Так вот эти игры (все, если не ошибаюсь) Capcom были настроены на горизонтальный скроллинг и как правило проводили в горизонтальном скроллинге большую часть игрового процесса.
Вертикальный же осуществлялся за счёт неотображаемых на экране телевизора нижних и верхних строк экранных областей — поле скроллилось быстро обновляя информацию в этих невидимых зонах.
Причём в Duck Tales чтобы скроллинг не мог «упереться» в Status Bar лестницы располагались только в таких местах где под лестницей была вторая экранная область без Status Bar:

Т.е. как и в Bomberman панель с информацией приклеена к верхней части первой экранной области, а лестницы по мере скроллинга поля могут располагаться только в местах которые кратны второй экранной области — тогда при скроллинге вниз панель информации на экране не может появится, а поле обновится как надо.
Интересно, что в Chip & Dale эту технику отточили до совершенства и там вертикальный скроллинг реально осуществляется прямо в игровом процессе, но… Status Bar разработчики добавить уже не стали!

KONAMI

Интересно сравнить как обстояли дела у конкурента Capcom — Konami.
В 1986 году Konami выпускает несколько игр на Famicom/NES и две из них довольно знаменательны.
Это Gradius:

… и Castlevania:

Как видно в них есть панель с информацией, но скроллинг в этих играх строго горизонтальный и больших проблем это не должно было вызывать.
В 1987 году выходит Castlevania II:

… а в 1988 году выходит Contra:

В обеих играх появляется вертикальный скроллинг, но зато исчезает Status Bar — в первой жизни отображаются вертикальной полоской спрайтов как в Megaman, а во второй горизонтально расположенными медальками как были сердечки в Chip & Dale у Capcom.
И вот в 1989 году выходит Castlevania III:

И вот здесь сочетаются все факторы — есть и полноценная панель с информацией и смена скроллинга на вертикальный.
Фрагмент с вертикальным скроллингом есть, например, на 36:30 в следующем видео:

А вот в 1990 году выходит Super C (Super Contra) которая раздвигает горизонты еще шире:

Дело в том, что в ней стал возможен одновременный скроллинг и по вертикали и по горизонтали.
Например на следующем видео экран скроллится наискосок на 0:33:

Однако… ценой за это усложнение стало исчезновение информационной панельки и откат её к спрайтам–медалькам как в Contra. :9
Но уже в 1991 году выходит TNMT 3:

В которой есть и «наискосочный» скроллинг и панель с информацией! :)
Высота взята — хотя я не уверен, что этого не случилось где–то раньше, ибо смотрел только самые известные игры.
В дальнейшем произвольный скроллинг вместе со Status Bar был у Konami не редким гостем — это еще и вышеупомянутая игра «Contra Force» и «Monster in My Pocket» и «Tiny Toon Adventures» и другие.
Таким образом программистам Konami произвольный скроллинг совмещённый со Status Bar похоже что покорился в 1991 году или чуть ранее. :)

NINTENDO

Ну а сама Nintendo «освоила» произвольный скроллинг вместе с информационной панелью как минимум в 1988 году в Super Mario Bros. 3 (во второй части уже был произвольный скроллинг, но панелька отсутствовала):

Видимо доскональное знание всех особенностей железа помогало придумать как тут действовать.

Технически это осуществлялось вот так: экранные области компоновались вертикально и статус бар располагался в самой верхней части первой где находился неподвижно. Если текущая карта позволяла скроллиться во всех направлениях одновременно, то высота её была ограничена вот этими двумя экранами по высоте за вычетом высоты Status Bar–а, поэтому он и мог оставаться неподвижным (в отличие от примера с Contra Force из начала статьи) — экран никогда и не пытался вторгнуться в зону информационной панели. При этом для скроллинга по горизонтали прятался левый столбец экрана из 8 пикселей (штатная функция железа Famicom/NES — это видно на скриншоте выше) и в этой колонке и происходило обновление полоски тайлов с последующей прокруткой. Однако т.к. цветовые атрибуты в NES охватывали сразу 2x2 тайла, то с правой границы экрана без труда можно заметить мельтешение цветовых атрибутов. С этим мирилось множество игр с произвольной прокруткой экрана.

Точно так же поступала игра Felix The Cat (Hudson Soft, 1992) — прокрутка карты по вертикали была ограничена двумя экранами минус высота Status Bar. Но в Felix The Cat ничего с краёв не мельтешило — это достигалось за счёт того, что и правый край экрана прятался под рядом из чёрных спрайтов за счёт чего было как бы две колонки обрезки и слева и справа:

Таким образом обновления цветовых атрибутов блоками тайлов 2x2 прятались без следа. Ценой был вывод из использования чуть меньше чем 30 спрайтов из возможных 64.

Игры же с потенциально неограниченным скроллингом во всех направлениях типа Contra Force сочетали самое сложное: и трюк из начала статьи про эту же игру и такие же прокрутки влево–вправо как описано выше с Mario Bros. 2.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.