Spiiin's blog

Устройство спецэффектов на NES. Эффекты горизонтального скролла.

TODO: восстановить гифки

В качестве примера для изучения спецэффектов на NES можно взять эту коллекцию.
Орудие для изучения - эмулятор Mesen и скрипт mesen_logParallax.lua.

Он позволяет посмотреть, в каких играх используются эффекты горизонтального скролла, а в какие - что-то другое (анимации фона записью в видеопамять, смена видеобанков или что-либо ещё).

Под катом будет объяснение того, что такое эффекты горизонтального скролла, какие именно они бывают и много гифок с примерами. Вас предупреждали!

Итак, самое простое и не очень понятное объяснение: эффекты горизонтального скролла - группа спецэффектов, которая получается за счёт того, что видеопроцессор NES умеет сдвигать позицию скролла в ходе рисования кадра. В начале кадра для видеопроцессора можно установить горизонтальную и вертикальное позицию левого верхнего угла заготовленной картинки, которую он будет отрисовывать. Далее он начинает рисовать кадр строку за строкой - вот интересный пример этого процесса, снятый в супер сломо.

Прямо в ходе рисования можно подправить позицию горизонтального скролла (но не вертикального!), чтобы оставшаяся часть экрана сдвинулась горизонтально относительно предыдущей - это и есть эффект горизонтального скролла. С теорией всё, дальше примеры того, что именно можно получить таким способом.

Отрисовка GUI снизу или сверху экранаПростейший и понятнейший пример - Super Mario Bros.

Здесь очевидно, что часть экрана над зелёной полосой не скроллится совсем, в отличие от нижней. Трюки, которые используются для того, чтобы точно попасть в период, пока видеопроцессор отрисовывает конкретную строку, очень хитрые, и заслуживают отдельной статьи. Отмечу только то, что если в игре для отображения GUI используется чёрная панель - скорее всего в период отрисовки чёрных строк игра вообще выключает рендеринг, чтобы сделать что-то сложное, что возможно только при выключенном рендеринге.

ПараллаксЭффект параллакса позволяет отобразить то, что для наблюдателя находящиеся дальше объекты движутся медленнее, чем более близкие. В более новых играх специально для реализации этого существует возможность рисовать на нескольких слоях, независимых друг от друга, но на NES их нет, поэтому разработчики эмулировали слои за счёт горизонтального скроллинга частей картинки. Важное ограничение таких слоёв - чтобы они никогда не пересекались по вертикали между собой, что можно проверить в скрипте (без разделяющей слои линии они игроку намного менее заметно, что слои полностью раздельные).

Простейший пример - бегущий на фоне заката кот-ниндзя из Kyatto Ninden Teyandee.

Здесь, также как и в Марио, достаточно всего одного разделения экрана на подвижную и неподвижную часть (ну и второе разделение зону GUI, которое встречается почти в каждой игре, про него отдельно упоминать не буду).

Более красивый и сложный пример - красная планета в Bucky O’Hare:

Здесь к статичному небу добавлен слой дальних облаков в небе и более близких гор. Без разделительных линий кажется, что существует ещё слой ландшафта между горами и слоем игрока за счёт того, что он однородный и глаз не может определить движется ли этот слой или нет. Есть много игр с примерами параллакса такого типа - Joe & Mac - Caveman Ninja, Totally Rad, Metal Fighter, Vice - Project Doom и другие.

Однако стоит помнить, что если вы видите эффект пересечения слоёв на одной горизонтали (параллакс за окошками в другом уровне Bucky O’Hare) или вообще вертикальный параллакс (на стенках колодца 2 уровня Battletoads, стартовая заставка Megaman 2), помните - горизонтальный скролл невозможно изменить посреди строки - в этих играх используются другие эффекты.

Отдельный интересный случай параллакса с движущимся дальним фоном - уровни с поездами, примеров много, пусть будет Spartan X2:

Параллакс также заметен, если камера находится внутри овального объекта или пещеры. В таком случае нижняя и верхняя часть будут ближе к камере, чем дальняя стена. Лучший пример - турбо-туннель в Battletoads:

Последняя пара примеров, посвящённая параллаксу, относится к случаю, когда отображаемая плоскость сильно наклонена по отношению к камере, в этом случае будет хорошо заметна разная скорость движения частей плоскости, и необходимо много слоёв для её отображения.

Посмотрите на количество слоёв пола в TMNT4: Tournament Fighters:

Либо на море в TMNT3: Manhatten Project:

Отображение движения частей сцены

Данный эффект применяется как для отображения крупных частей сцены (босс в Tiny Toon Adventures, другие игры с движением только горизонтальных платформ):


Так и для относительно мелких частей сцены, вплоть до отдельных строк (участки дороги при повороте в Super Spy Hunter):

Участком сцены также может быть крупный объект, который изначально выглядит спрайтом, а не фоном , но является слишком крупным для спрайта, потому что спрайты имеют ограничение на размер, общее количество, а также количество в одной строке. Например, шар у босса зелёной планеты в Bucky O’ Hare (эта игра вообще очень богата на разные эффекты) рисуется фоном, но двигается отдельно от пола:

Тут отдельно хочется упомянуть игру Chip & Dale Rescue Rangers 2 и больших боссов в ней. Они рисуются в фоне, но параллакса в игре нет. Геймдизайнеры решили проблему раздельного движения боссов и пола гениально - перед движением босса всегда потухает свет и пола не видно. Особенно эффектно это сделано на боссе Ведьма:

Часто эффекты раздельного движения слоёв сцены применяются для эффектного появления текста или заставок. Сразу два эффекта на старте Jurassic Park:

или просто красивого совмещения частей сцены:

На этом у меня пока всё ^_^.

update гифки убились при переносе блога, но остались в статьях на хабре
https://habr.com/ru/post/353726/
https://habr.com/ru/post/354774/