Info Guide #12
31 декабря 2017

Графика - палитра: Палитровые эффекты в играх.

 Палитровые эффекты в играх
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 умеет выводить на экран ра─
змером 320x200px одновременно 16 цветов из
64 возможных. Откровенно  говоря, часть из
тех 64 цветов практически бесполезна из-за
своей "вырвиглазности" (например,кислотно-
зелёный  или жвачечно-розовый), но это уже
издержки. Может  быть, кто-то  и им найдёт
применение,но чаще всего будут использова─
ться все оттенки серого, плюс черный с бе─
лым и тёмные оттенки разных цветов.
   На каждую  составляющую цвета (красный,
зелёный, синий) отведено 2 бита.
   Таким образом,каждая составляющая может
принимать значения:
             представление:
       бинарное    шестнадцатиричное
            00         00
            01         55
            10         AA
            11         FF
   Запись  цветовых компонентов идёт в об─
ратном порядке - т.е. BGR.
   Например, в коде  программы нужно заме─
нить  какой-то  цвет в палитре на 0xffaa55
(светло-оранжевый).
   Преобразуем составляющие:
            R - 0xff - %11
            G - 0xaa - %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 гонках с видом сзади (Сhase HQ,
Top Gear, Outrun), да ещё много где: Space 
Harrier, например. 

                  * * *

   Я описал  наиболее  часто встречающиеся
эффекты. Самих палитровых спецэффектов ве─ 
ликое множество. Есть ещё огромная катего─ 
рия простеньких эффектов в один/два цвета, 
вроде  вспышек  от  молний, неоновых огней 
где-то на горизонте и т.д.Но они настолько 
примитивны, что читатель,при желании,легко 
сам разберётся,как такие эффекты делаются. 
   Хочу  также  заметить, что  планировать
эффекты нужно ещё до начала рисовки графи─ 
ки, т.к.для них может попросту не остаться 
места в палитре. Как ни прискорбно,но обы─ 
чно  бывает наоборот. Разработчик в запале 
энтузиазма  делает один-два уровня, рисует 
для  них  графику, спрайты, фоны, а только 
потом начинает думать,как же всё это вели─ 
колепие сделать ещё лучше при помощи эффе─ 
ктов. Но палитра  уже использована под за─ 
вязку,и нужно либо отказаться от эффектов, 
либо перерисовывать графику, что-то выбра─ 
сывать,что-то перетасовывать.И хорошо,если 
дело окажется только в графике. Может быть 
такое,что придётся кардинально менять дви─ 
жок.Так вот,чтобы такого не было,товарищи, 
перед  началом физической работы над игрой 
хорошенько всё продумайте,что в игре будет 
и в какой момент будет появляться. 




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
FunTop98 - подсчёт голосов.
Реклама - реклама и объявления.
Вдруг пригодится - Про RESET.

В этот день...   23 сентября