Палитровые эффекты в играх
Hippiman/Conscience
ATM Turbo (и его реализация в ZX Evo )-
достаточно мощная машинка, для Спектрум-
совместимых компьютеров, конечно.
Однако,не настолько мощная,чтобы тянуть
полную перерисовку всего экрана и уклады─
ваться при этом в один кадр. По крайней
мере, в Evo SDK это так.
Но есть один финт ушами, который позво─
ляет перекрасить весь экран и сделать это
быстро.Называется он "палитровые эффекты",
подходит не на все случаи жизни,но об этом
я расскажу дальше.
Кто иль что есть палитра?
Грубо говоря, в нашем случае палитра -
это некая область памяти, где хранится
информация о цветах, которые могут быть
выведены на экран в данный момент.
А само изображение хранится не в форма─
те цвета на точку, а в виде последователь─
ности индексов.
Это позволяет существенно сэкономить
память, например:
- изображение 320x200 в 32-битном цвете
будет занимать 320*200*4=256000 Б = 250 кБ
- изображение 320x200 из 256 цветов бу─
дет занимать 320*200=64000 Б = 62,5 кБ
- а изображение в стандарте ATM/ZX Evo с
палитрой из 16 цветов будет занимать всего
320*200*0.5=32000 Б = 31 кБ.
Разница очевидна.
При очевидных плюсах индексированной
графики: малые размеры изображения и, как
следствие, меньшая нагрузка на систему,та─
кой подход к хранению изображения имеет и
отрицательные стороны в виде меньшей "цве─
тастости", а при малом размере палитры -
ещё и виде головной боли при попытке втис─
нуться в эту палитру и сделать красиво.
Так, чтобы периодически можно было ме─
нять цвета (от уровня к уровню, например).
И так, чтобы графика могла использоваться
многократно, а не единожды при какой-то
строго определённой палитре, да ещё оста─
лось пара незанятых цветов под эффекты во
время игры.
Представление цвета на ATM/ZX Evo
Теперь перейдём ближе к нашей платфор─
ме. ATM/ZX Evo умеет выводить на экран ра─
змером 320x2OOpx одновременно 16 цветов из
64 возможных. Откровенно говоря, часть из
тех 64 цветов практически бесполезна из-за
своей "вырвиглазности" (например,кислотно-
зелёный или жвачечно-розовый), но это уже
издержки. Может быть, кто-то и им найдёт
применение,но чаще всего будут использова─
ться все оттенки серого, плюс черный с бе─
лым и тёмные оттенки разных цветов.
На каждую составляющую цвета (красный,
зелёный, синий) отведено 2 бита.
Таким образом,каждая составляющая может
принимать значения:
представление:
бинарное шестнадцатиричное
00 00
01 55
10 AA
11 FF
Запись цветовых компонентов идёт в об─
ратном порядке - т.е. BGR.
Например, в коде программы нужно заме─
нить какой-то цвет в палитре на Oxffaa55
(светло-оранжевый).
Преобразуем составляющие:
R - Oxff - %11
G - Oxaa - %10
B - 0x55 - %01
Запишем в обратном порядке в двоичном
виде:
BGR - %011011
Преобразуем в десятичное число, для ис─
пользования в коде (т.к. в C не предусмот─
рена возможность записи двоичных чисел). В
win7 с этим отлично справляется встроенный
калькулятор:27.
Для чего это нужно
Перейдём к главному вопросу: зачем во─
обще нужно заморачиваться с палитрой рядо─
вому программисту для ATM/ZX Evo?
Ответ прост - для спецэффектов. Можно,
конечно, обойтись и без них, игра в плане
интересности от этого ничего не потеряет.
Но мы-то знаем, что игрока нужно сначала
завлечь, а что, как не красивая графика,
полная спецэффектов, лучше всего снижает
планку вхождения?
Вся прелесть палитровых эффектов в том,
что они крайне экономно расходуют ресурсы
системы. Чтобы получить результат, нужно
всего лишь изменить пару байт, вместо ре─
сурсоёмкой перерисовки изображения целиком
или какой-то его части. Применение палит─
ровых эффектов вместо анимации там,где это
возможно, действительно очень сильно раз─
гружает процессор.
Примеры
1. Самый простой и часто используемый:
плавное затемнение и осветление экрана.
Чаще всего применяется при переходе от од─
ной сцены к другой (например, из меню в
игру).
Делается изменением яркости палитры фу─
нкциейpal_bright(u8 bright), где параметр
bright может принимать значения от0 - всё
черное,до6 - всё белое. 3 - соответствен─
но, нормальное значение яркости.
Также изменением яркости палитры на
один-два кадра можно делать различные
вспышки (от взрывов, молний и т.д.)
2. Другой часто используемый пример:
анимация воды.
Я нарисовал картинку - пример. На ней
показано, как можно сделать анимированную
воду без анимации как таковой. В верхнем
ряду можно видеть само изображение, а в
нижнем - состояние трёх цветов палитры.
Смысл вот в чём.В тайле воды изначально
спрятано два кадра анимации (это хорошо
видно по последнему кадру, где все три
цвета разные). Эти два кадра (в смысле, с
разными волнами) одновременно никогда не
показываются, цвет одного из них делается
равным цвету фона.Эффекта волн можно доби─
ться,плавно изменяя один цвет,когда второй
равен цвету фона. Затем они меняются мес─
тами. И так по кругу.
3. Эффект затенения.
Смысл этого эффекта схож с первым,одна─
ко первый эффект затемняет весь экран, а
бывают ситуации, когда этого делать не ну─
жно.
Например, персонаж выключает в комнате
свет. Интерфейс должен остаться видимым,
персонаж и пол, скорее всего тоже.
В такой ситуации нужно четко разделять
цвета, которые никогда не будут меняться
(цвета интерфейса, персонажа,других нужных
объектов), и цвета окружения, на которые
будет накладываться эффект. В приложении -
пример из игры Sonic & Knuckles на Sega
Mega Drive (sonic_sample.gif ). Естест─
венно, на этой платформе цветов больше, и
активная палитра больше в четыре раза, но
общий смысл от этого не меняется. При вы─
ключении света часть цветов остаётся неиз─
менной, а часть меняется по заранее соста─
вленной таблице.
Немного поясню касательно таблицы изме─
нения цветов. Для каждого цвета в палитре
заранее просчитываются все его состояния
при включенном свете и выключенном. При
необходимости программа проходит по значе─
ниям этой таблицы и по очереди применяет
их к экранной палитре.
4. Эффекты движения.
Наиболее красиво смотрящиеся эффекты.
Чаще всего применяются для анимации ручь─
ёв, водопадов, конвейеров и пр.
В общем, всего движущегося,чья анимация
циклична и помещается в один-два тайла.
В качестве примера возьму тайл водопада
из второго уровня Contra для Famicom.
В маленьком квадрате снизу - одиночный
тайл. Над ним,для наглядности,девять таких
же, поставленных сеткой 3x3.
Из примера должно быть и так всё поня─
тно, но на всякий случай - тайл рисуется
таким образом,чтобы при циклическом сдвиге
цветов в палитре создавалась иллюзия дви─
жения, в данном случае воды.
5. Вот более сложный пример из финальной
заставки Nomad для ATM Turbo 2+/ZX Evo, в
котором создаётся эффект движения отдельно
стоящих объектов:nomad_outro.png.
В верхней части примера - базовая кар─
тинка, для наглядности раскрашенная во все
цвета радуги.Как видно из примера,она раз─
делена на множество узких полос,из которых
в конечном итоге и получится анимация. В
программе все эти полоски раскрашиваются
цветами из таблички снизу: два цвета - си─
ние, остальные - черные. Собственно,почему
две полоски окрашиваются в синий? Для пла─
вности анимации. Каждый такт полоска сдви─
гается на половину своей длины.
По такому же принципу делается анимация
земли в 2D гонках с видом сзади (Chase HQ,
Top Gear, Outrun), да ещё много где: Space
Harrier, например.
* * *
Я описал наиболее часто встречающиеся
эффекты. Самих палитровых спецэффектов ве─
ликое множество. Есть ещё огромная катего─
рия простеньких эффектов в один/два цвета,
вроде вспышек от молний, неоновых огней
где-то на горизонте и т.д.Но они настолько
примитивны, что читатель,при желании,легко
сам разберётся,как такие эффекты делаются.
Хочу также заметить, что планировать
эффекты нужно ещё до начала рисовки графи─
ки, т.к.для них может попросту не остаться
места в палитре. Как ни прискорбно,но обы─
чно бывает наоборот. Разработчик в запале
энтузиазма делает один-два уровня, рисует
для них графику, спрайты, фоны, а только
потом начинает думать,как же всё это вели─
колепие сделать ещё лучше при помощи эффе─
ктов. Но палитра уже использована под за─
вязку,и нужно либо отказаться от эффектов,
либо перерисовывать графику, что-то выбра─
сывать,что-то перетасовывать.И хорошо,если
дело окажется только в графике. Может быть
такое,что придётся кардинально менять дви─
жок.Так вот,чтобы такого не было,товарищи,
перед началом физической работы над игрой
хорошенько всё продумайте,что в игре будет
и в какой момент будет появляться.
Other articles: