» » Скроллинг и эффекты параллакса на ZX Spectrum
Навигация по сайту
Случайная игра

Вступай!!!
Облако тегов
Скроллинг и эффекты параллакса на ZX Spectrum

Скроллинг и эффекты параллакса на ZX Spectrum

В отличие от игровых приставок и других, более продвинутых домашних компьютеров, ZX Spectrum не имеет абсолютно никаких аппаратных средств для ускорения вывода графики. Всё, что есть в распоряжении программиста - отображаемые на экране 6912 байт основного ОЗУ. С одной стороны при этом нет ограничений, свойственных аппаратным видеоконтроллерам, например по количеству и расположению графических элементов или времени доступа к видеопамяти - можно выводить что угодно и куда угодно, что даёт ZX Spectrum заметное преимущество перед приставками в отображении трёхмерной графики. Но, с другой стороны, вся работа по отрисовке фона, наложению спрайтов и скроллингу делается полностью программно. Таким образом, скорость вывода графики, а значит и частота обновления экрана, ограничена быстродействием процессора и эффективностью кода. Своеобразная организация видеопамяти, относительно небольшой объём ОЗУ и его разделение на "быструю" и "медленную" половины вносят дополнительные сложности.
Так как слишком низкая частота обновления экрана делает игровой процесс некомфортным, разработчики игр были вынуждены ограничивать количество подвижных объектов, уменьшать и без того ограниченный размер экрана до окна примерно в две трети от полного размера, добавляя всевозможные рамки и статусные панели с разных сторон, а часто и полностью отказываться от скроллинга. Даже с такими ограничениями, немногие игры шли со скоростью 25 кадров в секунду, а большинство игр работало со скоростью 16, 12 или 10 кадров в секунду, и даже меньше в некоторых трёхмерных играх. Эти цифры не случайны, они зависят от того, сколько телевизионных кадров, неизменно следующих с частотой 50 в секунду, затрачивала та или иная игра на одну перерисовку экрана
- 2, 3,4, 5 и так далее.

Знакоместа
Скроллинг и эффекты параллакса на ZX Spectrum
Две буквы находятся в центре знакомест. В одном знакоместе выбраны красный и жёлтый, в другом - синий и белый цвета. В области вокруг этих знакомест выбраны черный и белый цвета.
Скроллинг и эффекты параллакса на ZX Spectrum
Теперь буквы смещены на три пикселя влево и вышли за пределы своих знакомест, окрасившись в цвета соседних.

Из-за технических ограничений ZX Spectrum реализация плавного скроллинга, с шагом меньше 8 пикселей, сталкивается с массой проблем. Наиболее заметная визуальная проблема - так называемый "атрибутный клэ-шинг", возникающий из-за низкого цветового разрешения. Цвет задаётся не для каждого пикселя, а для блоков 8x8, "знакомест". Выходящая при скроллинге часть графики одного знакоместа окрашивается в цвета другого знакоместа. Эту проблему можно обойти хорошей планировкой графики, например разделяя разноцветные элементы промежутками в 8 пустых пикселей по направлению скролла. Тогда клэшинг будет заметен только на спрайтах, выводимых поверх фона. Его также можно уменьшить, выводя спрайты "за" фоном, то есть просто не выводя части спрайта, попадающие в знакоместа, в которых присутствует фон. Примеры удачного решения этой проблемы - игры Zynaps и Dark Fusion. Но чаще всего разработчики игр просто отказывались от использования цвета, если в игре присутствовал плавный скроллинг.

ОЗУ ZX Spectrum
Хотя объём ОЗУ ZX Spectrum существенно больше объёма ОЗУ 8-битных игровых консолей, не стоит забывать, что в него должно помещаться всё - и программный код, и данные графики, и всевозможные игровые переменные. За счёт размещения видеопамяти в общем ОЗУ фактически программам доступно чуть больше 41 КБ. Для сравнения, в самой минимальной конфигурации приставка Денди (NES) позволяет использовать 32 КБ памяти для кода, 8 КБ для графики, 2 КБ ОЗУ для хранения переменных и 2 КБ видеопамяти - в сумме 44 КБ, что вполне сравнимо, хотя и накладывает некоторые ограничения.

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

Трюки на ZX Spectrum
Скроллинг и эффекты параллакса на ZX Spectrum
Так выглядит игра Sea Dragon с точки зрения игрока. Большое игровое окно почти во весь экран, кажущаяся большой заполненность фона разными элементами.

Скроллинг и эффекты параллакса на ZX Spectrum
Но за счёт наличия на экране больших одноцветных областей, с точки зрения кода экран выглядит так. В жёлтых областях происходит скроллинг фона, в красных - стирание остающихся за ним следов. Таким образом в этом кадре обрабатывается всего около одной седьмой от полного объёма данных экрана.

Вертикальный скроллинг с любым шагом делается относительно просто. Область экрана в ОЗУ организована в виде перемешанных определённых образом строк по 32 байта, хранящих биты 256 пикселей одной строки экрана - по биту на точку. Достаточно копировать побайтно строки фона в нужные места в памяти, например каждую строку на одну или несколько строк ниже, дорисовывая новые сверху - получается скроллинг вниз. Плавный горизонтальный скроллинг существенно сложнее, так как соседние по горизонтали 8 пикселей хранятся в виде бит одного байта, и их надо перемещать сначала внутри байта, а потом в соседний байт - требуется работать с отдельными битами.
Горизонтальный скроллинг экрана с шагом в один пиксель можно организовать командами побитового сдвига процессора Z80. Это работает довольно медленно, сдвиг содержимого всего экрана займёт время двух-трёх телевизионных кадров. Помимо этого также нужно дорисовать новый столбец пикселей фона, вывести спрайты в новых местах и восстановить фон там, где спрайтов уже нет. Эти операции не только занимают значительное время, но и вынуждают проделывать всё это не в памяти экрана, а в его невидимой копии в ОЗУ, чтобы игрок не мог заметить пропадающие и смещающиеся спрайты. Копию после этого надо переместить в область видимого экрана, что опять требует затрат времени. Таким образом легко набегает 4-6 телевизионных кадров, для полного экрана скорость обновления получится около 8-12 кадров в секунду. Если посчитать, что игровое окно размером в две трети экрана будет обновляться 12 раз в секунду, полная ширина экрана будет прокручена за 21 секунду - то есть герой будет двигаться по уровню очень медленно, а это подходит не для всех игр. Поэтому такой простой способ прокрутки используется редко. Прокрутка с шагом в 4 пикселя может быть сделана аналогичным образом, так как у Z80 есть команды обмена полубайт. Это несколько медленее попиксельной прокрутки, что также даёт низкую частоту обновления экрана, но шаг прокрутки в четыре раза больше, что компенсирует скорость перемещения по уровню. Такой подход также использовался нечасто, в том числе и потому что подобная комбинация шага прокрутки и частоты обновления экрана смотрится не очень приятно для глаза, перемещение происходит заметными рывками.

Скроллинг и эффекты параллакса на ZX Spectrum
Графика в A.M.С. всегда оставляет неизгладимое впечатление на любого игрока впервые засевшего за неё на ZX Spectrum.

Для прокрутки с другим шагом, и особенно с переменным шагом, если герой игры может плавно разгоняться и замедляться, описанные выше способы не годятся. У Z80 нет команд побитового сдвига с другим шагом, а многократный сдвиг по одному биту значительно замедлит и без того не быструю прокрутку. В этом случае используется другой метод - перерисовка всех элементов фона каждый игровой кадр. Так как сдвиг графики во время вывода в буфер по затратам времени мало отличается от прокрутки уже отрисованного буфера, используется трюк, который также часто используется для вывода спрайтов - хранение заранее сдвинутых элементов фона. Например, если шаг прокрутки два пикселя, в памяти хранятся четыре копии - не сдвинутая, сдвинутая на два, четыре и шесть пикселей. Памяти для графики при этом требуется в четыре с небольшим раза больше. Для попик-сельного скроллинга понадобится восемь копий и в восемь раз больше памяти. Это довольно много для ограниченного объёма ОЗУ, поэтому шаг в два пикселя часто использовался как разумный компромисс между скоростью и расходом памяти на графику. Дополнительная память, та, которая "с небольшим", требуется для хранения тех байт, в которые выдвигаются уходящие за пределы элемента фона пиксели. Конечно, их можно выдвигать циклически, вдвигая с другой стороны элемента, но тогда при выводе понадобятся дополнительные операции маскирования ненужных бит. Для устранения этих операций частично сдвинутый элемент фона должен быть на один байт шире, чем не сдвинутый -например, элемент размером 16x16 пикселей (32 байта) хранится как 24x16 (48 байт).

Хранение графики в ZX
При хранении графики в виде последовательности данных некоторой длины алгоритм её вывода получается примерно такой:
1. Прочесть значение по текущему адресу источника.
2. Записать значение в текущий адрес назначения.
3. Увеличить адрес источника
4. Увеличить адрес назначения
5. Уменьшить значение счётчика длины.
6. Если счётчик не 0, перейти на шаг 1.
При хранении графики в виде развёрнутого кода убирается значительное количество операций за счёт очень существенного увеличения объёма кода:
1. Записать значение, заданное непосредственно в коде, в текущий адрес назначения.
2. Увеличить адрес назначения.
Эти два шага повторяются в памяти для каждого байта выводимой графики. Роль адреса источника при этом играет программный счётчик процессора (Program Counter), изменяющийся при выполнении каждой команды.

Метод перерисовки фона с использованием сдвинутых копий также даёт возможность существенно повысить частоту кадров за счёт небольшого заполнения экрана элементами фона -большие пустые области не требуется перерисовывать, достаточно только стирать следы, остающиеся за полностью вышедшими в соседнее знакоместо элементами. Подобным образом в некоторых играх достигалась скорость обновления экрана 25 кадров в секунду. Если принять ещё более строгие ограничения, сделав фон простой повторяющейся текстурой с коридорами пустоты внутри неё, можно добиться даже крайне редко встречающейся в играх на ZX Spectrum 48К скорости обновления экрана 50 кадров в секунду. При этом перерисовываются только границы перехода из текстуры фона в пустоту, а области с текстурой и пустым местом остаются неизменными. Так сделано в относительно свежем порте игры Sea Dragon с Atari.
По сравнению с плавным скроллингом, нередко встречавшийся в играх "познакоместный" скроллинг фона, с шагом в 8 пикселей, не представляет особых проблем, и по сути мало чем отличается от печати текстовых сообщений. Каждый байт графики просто копируется в соответствующий адрес экрана. Не требуется проводить операций с отдельными битами, решать проблему клэшинга или хранить несколько копий графики с разными сдвигами - нужно просто перерисовывать игровой экран целиком с нужным смещением в карте уровня. Если спрайты накладываются по знакоместам, полностью заменяя блоки фона, не нужна даже невидимая копия экрана - достаточно карты с номерами графических элементов, похожей на буфер текста. Фон под спрайтами восстанавливать также не требуется, так как он всё равно перерисовывается целиком каждый кадр. Без особых проблем можно перерисовать игровой экран среднего размера за 2-3 телевизионных кадра, а за счёт такого большого шага прокрутки сильно повышать скорость отрисовки нет необходимости - за 32 обновления будет прокручена полная ширина экрана, такая высокая скорость перемещения по уровню редко бывает нужна в играх. Недостатком подобного подхода является затруднение ориентации и не очень приятные глазу рывки при перемещении. Эти проблемы частично компенсируются использованием более крупной графики, в частности спрайтов, что можно наблюдать во многих играх с познакоместным скроллингом.

Скроллинг и эффекты параллакса на ZX SpectrumСкроллинг и эффекты параллакса на ZX Spectrum
Sea Dragon

ZX Spectrum 128К, помимо расширенной памяти отличающийся от ZX Spectrum 48К наличием дополнительной экранной области, имеет небольшие преимущества. Дополнительная экранная область позволяет избавиться от медленного копирования из невидимого буфера на видимый экран - второй экран делается видимым простой записью значения в порт, а первый становится невидимым, и следующий кадр можно отрисовывать в него. Увеличенный объём ОЗУ позволяет более широко использовать ещё один трюк для ускорения вывода графики - хранение её не в виде данных, а сразу в виде развёрнутого кода, где данные являются частью команд, а также отсутствуют циклы и соответственно затраты времени на их обработку. На каждый байт графики в этом случае уходит несколько байт памяти, например 200 с лишним байт на элемент фона 16x16 пикселей, что ограничивает применимость трюка на 48К.

Hysteria на 50 FPS
Скроллинг и эффекты параллакса на ZX Spectrum
Экран в игре Hysteria разделён на следующие области. В чёрной расположена неподвижная рамка. Серая область находится внутри игрового окна, и хотя она выглядит единым целыми с белой областью, за счёт закраски в игре одним цветом фона, в ней выводятся только спрайты, а прокручиваемый фон в неё никогда не попадает и, соответственно, скроллинга в ней нет Таким образом, хотя игровое окно кажется довольно большим, область скроллинга занимает немногим больше трети экрана - это экономит время процессора.

Скроллинг и эффекты параллакса на ZX Spectrum
Обновление игровой ситуации и перерисовка почти всего игрового окна, включая спрайты, в этой игре происходит со скоростью 25 раз в секунду. Белая, самая большая область скроллинга прокручивается с шагом в один пиксель. Голубая полоска с повторяющейся текстурой прокручивается с шагом в два пикселя, визуально вдвое быстрее белой области. Жёлтая, самая нижняя полоска с повторяющейся текстурой, перерисовывается вдвое быстрее остального экрана, 50 раз в секунду и прокручивается с шагом также в два пикселя, что выглядит вдвое быстрее прокрутки голубой области, а также добавляет кажущейся плавности скроллингу.

Теперь перейдём к рассмотрению эффектов параллакса. Практически все их виды, встречающиеся на платформах с аппаратной поддержкой скроллинга - таких как Денди - встречаются и на ZX Spectrum, и используют те же принципы, отличаясь только в деталях реализации.
Самый простой эффект параллакса - звёздное небо, где точки-звёзды движутся с разной скоростью, создавая иллюзию нескольких плоскостей, находящихся на разном расстоянии от зрителя. Он часто присутствует в играх космической тематики, а иногда и в более "приземлённых" жанрах. В некоторых играх, таких как Thunderceptor, это единственный элемент фона, в других он дополняет основной фон - от самого минимального, такого как полоска земли в Silk Worm, до полноценного с плавным и быстрым скроллингом, как в Cobra и Dark Fusion. Для вывода звёзд достаточно установить нужные биты в тех байтах, в которые попадает каждая звезда, а для стирания -восстановить значение, которое имел байт до отрисовки звезды. Количество изменяемых при этом байт экрана невелико, оно существенно меньше, чем общий объём данных экрана, и зависит от количества звёзд на экране. Поэтому эффект требует гораздо меньших затрат времени процессора по сравнению с полноценным скроллингом. Так как изменённый при выводе звёзд фон нетрудно восстановить, эффект легко совмещается с любыми видами скроллинга.
Другой относительно простой эффект - разделение экрана на области разной высоты, которые прокручиваются с разной скоростью. При этом графика с одной области никогда не заходит на другую. В простейшем случае используют две области - одна без прокрутки, представляющая собой дальний задний план, и одна с прокруткой. Немного более сложный вариант - две области, где прокрутка происходит с разным шагом - основная, где происходит игровой процесс, и узкая полоска, обычно с повторяющейся текстурой, снизу или сверху, которая движется быстрее. Так сделано в Cobra, Running Man и на первом уровне в Thundercats, и даже такой простой эффект добавляет графике привлекательности. Принципиально это не отличается от обычного скроллинга, просто используются разные процедуры для прокрутки разных областей наиболее подходящим способом. Обычно этот подход используют при плавном скроллинге, так как познако-местная прокрутка с разной скоростью выглядит не очень хорошо.
Используя большее количество областей прокрутки можно получать более сложные и красивые эффекты параллакса. Battle Valley совмещает неподвижную область в верхней части экрана, основную в середине и узкую полоску внизу, создавая такими простыми средствами эффект трёх слоев фона. В Hysteria используется три области с разной скоростью прокрутки, две из которых содержат полоску с повторяющейся текстурой - также простой, но красивый эффект. Увеличивая далее количество областей, можно получить ещё более интересные эффекты. Например, в игре Р-47 на втором уровне таким образом сделан эффект уходящего к горизонту поля облаков -около пяти областей с разной скоростью прокрутки.

Эффект движения вглубь
Скроллинг и эффекты параллакса на ZX Spectrum
Скроллинг и эффекты параллакса на ZX Spectrum
Скроллинг и эффекты параллакса на ZX Spectrum
Эффект клетчатого пола с движением вглубь с использованием двух наборов вертикальных полосок. Разными цветами показаны разные наборы, по отдельности и собранные в конечную картинку.

Тот же самый принцип лежит в основе эффекта параллакса в гоночных и им подобных играх с видом 'сзади' - таких, как Outrun, Space Harrier или Galaxy Force, а также в некоторых играх с видом сбоку, например Earthlight. Области с разной скоростью горизонтальной прокрутки в них имеют высоту в один пиксель. В верхней части прокрутка происходит медленее, в нижней быстрее. На ZX Spectrum для получения достаточной скорости обновления экрана при этом не используется настоящая прокрутка - вместо нее делаются специальные процедуры для каждой строки. Для гоночных игр они рисуют в нужных местах бордюр и разделительные полосы требуемой ширины, а также, при необходимости, "текстуру" за пределами дороги. Для "клетчатого пола" процедуры выводят чередующиеся полоски разной ширины. Эффект движения вглубь обычно делается с помощью двух наборов полосок фона, которые просто чередуются в нужном порядке. Например, в одном наборе за пределами дороги белый фон, а в другом - чёрный, либо в одном наборе сплошные вертикальные полосы, идущие через одну клетку, а в другом - через другую.

Сложный параллакс
Скроллинг и эффекты параллакса на ZX Spectrum
Скроллинг и эффекты параллакса на ZX Spectrum
Скроллинг и эффекты параллакса на ZX Spectrum
Сложный эффект параллакса в игре Thanatos. Стена состоит из трёх спрайтов -двух башен разного размера и торца стены, а также из двух векторных элементов, сверху и снизу. Для ускорения вывода полностью залитые знакоместа просто закрашиваются атрибутами с одинаковым цветом бумаги и чернил, вместо заполнения данных графики -изменяется один байт на знакоместо вместо восьми.
В заливке стены присутствуют серьёзные артефакты, цвет фона просвечивает через её нижнюю часть. Возможно это связано с оптимизацией по скорости или размеру. Оптимизированные по скорости для разных частных случаев процедуры могут занимать довольно много места в памяти, а вывод с заливкой работает медленее отрисовки линий - по одной из этих причин разработчики могли решить использовать для отрисовки низа стены ту же процедуру, что используется для отрисовки дорог в нижней части экрана.

Ещё один простой эффект, наиболее часто использующийся в играх с познакоместным скроллингом - прокрутка повторяющейся текстуры. Его можно наблюдать в таких играх, как Teenage Mutant Hero Turtles, Rastan и на некоторых уровнях Turrican. В играх с плавной прокруткой эффект применяется редко, но также встречается -например, в Marauder. Идея заключается в том, что области "второго плана" заполняются тайлами, содержащими повторяющуюся текстуру небольшого размера. При движении в сторону данные текстуры попиксельно прокручивается в памяти в соответствующем направлении. Текстура размером 4 на 4 знакоместа занимает всего 128 байт, что намного меньше объёма данных экрана, поэтому её прокрутка не занимает много времени. Аналогичным образом делается анимация воды, либо постоянной прокруткой, либо заменой графики заполняющих тайлов кадрами из заранее подготовленной анимации.
В играх с познакоместным скроллингом также легко создать эффект параллакса с использованием неподвижного изображения заднего плана. Несмотря на простоту, эффект почти не использовался в играх. Из примеров можно назвать демо-версию игры Dark wing Duck. В этом варианте в знакоместа "пустых" областей фона выводится графика соответствующих знакомест неподвижного заднего плана. При этом возможны варианты - задний план может храниться в виде картинки в размером с игровую область, а может быть составлен из элементов фона и его графика может находиться в общем наборе.
Более ресурсоёмким, но и более интересным эффектом параллакса является создание полноценного слоя фона для заднего плана с наложением на него переднего слоя. Этот эффект возможно реализовать как с плавным, так и познакоместным скроллингом. В случае с плавным скроллингом эффект тратит больше времени процессора, так как передний план должен накладываться на задний "по маске", стирая пустые пиксели и устанавливая закрашенные - часто таким образом выводятся спрайты. Это реализовано в игре Turbo The Tortoise, где для экономии ресурсов задний план выполнен в виде повторяющейся текстуры небольшой высоты. Для более интересного эффекта верхняя часть заднего плана не прокручивается. Полноценный задний план с цветной графикой реализован в игре Astro Marine Corporation. Передний план прокручивается познакоместно, а задний - по четыре пикселя. Принцип похож на эффект с неподвижным задним планом, только в этом случае задний план также прокручивается тем или иным способом.
Вероятно, наиболее необычный и сложный эффект параллакса на ZX Spectrum можно видеть в играх Operation Hormuz, Spitfire и Thanatos. Они используют одинаковый принцип и, вероятно, один и тот же код. Скроллинга фона как такового в них нет -весь фон выводится спрайтами, в том числе и анимированными, с точностью до одного пикселя по горизонтали. Аналогично эффекту звёздного неба, шаг перемещения спрайтов зависит от условного расстояния до наблюдателя, только вместо точек выводятся спрайты. Расстояние также учитывается в порядке вывода спрайтов, чтобы ближние перекрывали дальние. Также в этих играх используются элементы векторной графики, совмещённые со спрайтами - например, дороги и стены замка в Thanatos, что создаёт довольно впечатляющий эффект глубины, редко встречавшийся даже на 16-битных игровых консолях.

Автор: Shiru
Журнал: Emulators Machine



Вернуться
  • Комментарий: 0
  • Просмотров: 4633

Комментарии:

Оставить комментарий