Программирование игр для Windows. Советы профессионала

Мультипликация с помощью регистров цвета


Зачастую мы видим не то, что есть на самом деле. Поэтому многие эффекты и мультфильмы делаются не так, как вы могли бы подумать. Мультипликация с Помощью регистров цвета использует один из таких технических трюков, в результате которого можно очень просто получить то, что было бы чрезвычайно сложно или дорого при решении задачи «в лоб».

Мультипликация с помощью регистров цвета основана на том факте, что образ — это набор цветов. Эти цвета, в свою очередь, определены значениями RGB в таблице выбора цвета. Например, представим, что мы имеем два идентичных объекта — два изображения дерева, каждое из которых состоит из пикселей восьми оттенков зеленого. Мы создаем два набора цветов, каждый из которых содержит одинаковые восемь оттенков. Затем, используя для каждого дерева свой набор, мы рисуем две картинки: то есть изображаем первое дерево, используя первый набор цветов, и второе — используя второй, как это показано на рисунке 7.5.

   Если мы передадим изображение этих деревьев на экран, то увидим два дерева, имеющих одинаковый вид, но нарисованных с применением различных Значений регистров цвета. Теперь перейдем к самому интересному: что если мы обнулим первый набор этих регистров? Первое дерево должно будет исчезнуть.

   На этом и основана мультипликация с использованием регистров цвета. Схематично это происходит так;

§

Каждое из интересующих нас изображений мы выполняем с помощью различных наборов регистров цвета с одинаковыми значениями RGB;

§          Затем делаем одно из изображений объекта невидимым, обнуляя соответствующие регистры цвета;

§          Потом заменяем регистры цвета «включенного» объекта значениями RGB «выключенного» изображения, оставляя другой банк регистров цвета обнуленным.       

Это создает ощущение движения объекта от одной позиции к другой, хотя на самом деле этого не происходит. И все это осуществляется изменением лишь нескольких регистров цвета.




Такую технику можно использовать для создания объектов, изменяющих свой внешний вид, движущихся по экрану или исчезающих. Чтобы показать вам, как это может работать, я создал демонстрационную программу BIRDANI.C, которая рисует маленькую птичку, летающую по кругу, но на самом деле неподвижную. Я нарисовал птичку в графическом редакторе, использовав при этом 13 оттенков серого цвета. Затем, с помощью программного обеспечения для работы с PCX, описанного в пятой главе, «Секреты VGA-карт», загрузил это изображение. После чего обнулил все цветовые регистры, составляющие эти 13 оттенков серого цвета. Затем я поместил серый в первый цветовой регистр, потом обнулил его, поместив серый в следующий цветовой регистр и так далее- В результате все это выглядит так, как будто птица взмахивает крыльями и летит по кругу. Листинг 7.6 содержит текст этой программы.



Замечание

Отныне в этой книге я буду использовать перекомпилированные библиотеки, поэтому вы больше не увидите старых функций в листингах программ. Текст большинства из этих функций я поместил в файлы с именем GRAPHO.C. Соответственно, файл заголовка будет называться GRAPHO.H. Чтобы функции GRAPH0.C были доступны для наших программ мы должны сначала скомпилировать сам GRAPH0.C (только убедитесь, что вы используете модель памяти MEDIUM). Затем во время липковки скомпонуйте получившийся объектный файл с той программой, с которой вы сейчас работаете. Не забудьте включить в вашу программу файл заголовка GRAPH0.H, иначе функции из GRAPH0.C будут иедоступны. Вы могли бы также создать библиотеку графических функций, используя программу Microsoft's Library Manager, LIB- Правда у нас только один файл с исходным текстом библиотечных функций, поэтому данная программа для нас излишне мощна. Однако решать, конечно же, вам. Короче говоря, если код из GRAPH0.C, GRAPH0.H и функция установки видеорежима каким-либо образом включены в программы этой главы, то они должны работать.

Листинг 7.6. Мультипликация с помощью изменения регистров цвета (BIRDANI.C).



// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ////////////////////////////////////

#include <io.h>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <dos.h>

#include <bios.h>

#include <fcntl.h>

#include <memory.h>

#include <malloc.h>

#include <math.h>

#include <string.h>

#include "graphl.h" // включаем нашу графическую библиотеку

// ОПРЕДЕЛЕНИЯ /////////////////////////////////////////////

#define BIRD_START_COLOR_REG 16

#define BIRD_END_COLOR_REG   28

// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ///////////////////////////////////

unsigned int far *clock = (unsigned int far *)Ox0000046C;

// указатель на внутренний таймер 18.2 "тик"/с

pcx_picture birds;

// ФУНКЦИИ /////////////////////////////////////////////////     

void Timer(int clicks)

{

// эта функция использует внутренний таймер с частотой 18.2 "тик"/с.

// 32-битовое значение этого таймера находится по адресу 0000:046Сh

unsigned int now;

// получаем текущее время

now = *clock;

// Ожидаем до истечения указанного периода времени.

// Заметьте, что каждый "тик" имеет длительность-примерно в 55 мс

while(abs(*clock - now) < clicks){}

} // конец Timer

////////////////////////////////////////////////////////////

void Animate_Birds(void)

{            

// эта функция перемещает птичку, изображенную 13-ю различными // цветами, последовательно включая один цвет и выключая остальные

RGB_color color_l, со1оr_2;

int index;

// очистка каждого из цветовых регистров,

// используемых в изображении птички

color_l.red   = 0;

color_l.green = 0;

color_l.blue  = 0;

color_2.red   = 0;

color_2.green = 63;

color_2.blue  = 0;

// очистка всех цветов

for (index=BIRD_START_COLOR_REG;

index<=BIRD_END_COLOR_REG; index++)

{

Set_Palette_Register(index, (RGB_color_ptr)&color_l);

} // конец цикла for

// делаем первую птичку зеленой и затем

// последовательно меняем цвета

Set_Palette_Register(BIRD_START_COLOR_REG,



   (RGB_color_ptr)&color_2) ;

// мультипликация цветами

while(!kbhit())

{

// меняем цвета

Get_Palette_Register(BIRD_END_COLOR_REG,

(RGB_color_ptr)&color_l) ;

for (index=BIRD_END_COLOR_REG-l;

index>=BIRD_START_COLOR_REG; index—) {

Get_Palette_Register(index,(RGB_color_ptr)&color_2) ;

Set_Palette_Register(index+l,(RGB_color_ptr)&color_2);

} // конец цикла for

Set_Palette_Register(BIRD_START_COLOR_REG,

         (RGB_color_ptr)&color__l);

// небольшая пауза

Timer(3);

) // конец оператора while

} // конец Animate_Birds

// ОСНОВНАЯ ПРОГРАММА //////////////////////////////////////

void main(void)

{

int index,done=0;

// установка видеорежима 320х200х256

Set_Mode(VGA256);

// инициализация PCX-файла, который содержит изображение птички PCX_lnit((pcx_picture_ptr)&birds) ;

// загрузка файла PCX

PCX__Load("birds.pcx", (pcx_picture_ptr)&birds,1); 

PCX_Show_Buffer((pcx_picture_ptr)&birds);

PCX_Delete((pcx_picture_ptr)&birds); 

_settextposition(0,0);

printf(" Hit any key to see animation."};

getch()

_settextposition(0,0) ;

print£("Hit any key to Exit.           ");

Animate_Birds();                           

// возврат в текстовый режим

Set_Mode(TEXT_MODE);

} // конец функции xnain

Конечно, программа BIRDANI.C элементарна. Однако с помощью этой техники можно получить потрясающие эффекты. Один из них мы и обсудим в следующем разделе.


Содержание раздела