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


Спрайты - часть 4


х_off = 25 * grab_x

+ 1;

у_off = 25 * grab_y + 1;

// вычисляем начальный адрес

y_off

=y_off * 320;

for (y=0; y<SPRITE_HEIGHT; y++)

{

for (x=0; x<SPRITE_WIDTH; X++)

{

// получить очередной байт текущей строки и поместить его

//в следующую позицию буфера спрайта

sprite_data[у*24 + х] = image->buffer[y_off + x_off + х];

} // конец копирования строки

// перейти к следующей строке

y_off+=320;

} // конец копирования

// инкрементировать счетчик кадров

sprite->num_frames++;

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

Эта функция по указателю на спрайт определяет его расположение в загруженном файле. Далее она выделяет память для хранения образа и инициализирует структуру данных (я решил делать спрайты размером 24 на 24 пикселя, но вам ничто не мешает изготавливать любые другие спрайты). Теперь, когда у нас подготовлены образы, следующим шагом будет их отображение на экране монитора. Для этого нам надо:

§          Вычислить начальную позицию спрайта согласно его координатам (х,у);

§          Преобразовать полученные координаты в адрес видеобуфера;

§          Переместить байты изображения в видеобуфер.

Для рисования спрайта мы должны выполнить все операции с текущим кадром анимации. Код в Листинге 5.13 делает все перечисленное.

Листинг 5.13. Функция рисования спрайта.


void DrawSprite (sprite_ptr sprite)

{

// функция, рисующая спрайт на экране строка за строкой,

// очень быстро. Вместо умножения используется сдвиг

char far *work_sprite;

int work_offset=0,offset,x,у;

unsigned char data;

// создаем альтернативный указатель на спрайт для ускорения доступа

work_sprite = sprite->frames[sprite->curr frame];

// вычислить смещение спрайта в видеобуфере

offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;

for (y=0; y<SPRITE_HEIGHT; y++)

{

for (x=0; x<SPRITE_WIDTH; x++)

{

// Проверка на "прозрачный" пиксель (с кодом 0).


Начало  Назад  Вперед



Книжный магазин