Секреты программирования игр


Битовое отсечение - часть 3


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

Если же растровое изображение больше экрана хотя бы по одному измерению, то идея «вылетает в трубу». Так обычно бывает, когда мы масштабируем спрайт, имитируя приближение игрока к объекту. Но пока мы будем предполагать, что спрайты всегда меньше игрового поля экрана.

Если вы изучали функцию Draw_sprite() пятой главы или другие ее модификации, то, должно быть, заметили, что в ней выполняется вложенный цикл FOR, в котором битовый образ объекта рисуется по столбцам. Каждый столбец начинается с Х-коордипаты спрайта и спускается вниз по координате Y. Таким образом, мы должны изменить механизм этого цикла так, чтобы принять во внимание новые отправные и конечные координаты (х,у) и изменить исходное местоположение спрайта, если одна из координат выходит за пределы экрана. Не забывайте о том, что если координата Х или Y (либо обе) выходят за пределы экрана, это еще не значит, что ваш объект вообще невидим. На рисунке 7.4 изображен иллюстрирующий это пример.

Давайте изменим функцию Draw_sprite(), чтобы отсечь данные, не попадающие на экран. Новая версия будет работать на 5 процентов медленнее, однако она всегда будет корректно рисовать спрайты. Листинг 7-3 содержит ее исходный текст.

 

Листинг 7.3. Новая функция Draw_Sprite() с отсечением.

void Draw_Sprite_Clip(sprite_ptr sprite)

{

// Эта функция рисует спрайт на экране и отсекает области,

// выходящий за границы экрана. Функция написана в

// демонстрационных целях.

char far *work_sprite;

int work_offset=0,offset,x_off,x,y,xs,ys,xe,ye, clip_width, clip_heigth;

unsigned char data;    

// Получить указатель на спрайт

xs = sprite->x;

ys = sprite->y;

// Расчет координат прямоугольника, описывающего спрайт

xe=xs+sprite_width-1;

ye=ys+sprite_height-1;

// Проверка полной невидимости спрайта

// (то есть лежит ли он полностью за пределами экрана)

if((xs>=SCREEN_WIDTH) || (ys>==SCREEN HEIGHT) ||

(xs <= (-sprite_width)) || (ys<=(-sprite_height)))




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