Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать неотразимый комплимент Как противостоять манипуляциям мужчин? Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?

Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника







Листинг 5.12. Функция извлечения спрайта из загруженного PCXфайла





void PCX_Grap_Bitmap(pcx_picture_ptr image, sprite_ptr sprite, int sprite_franie, int grab_x, int grab_y)

{

// функция выделяет одно изображение из буфера в который

// загружен PCX-файл

// функция исходит из предположения, что в действительности массив

// пикселей размером 320х200 разделен на отдельные изображения

// размером 24х24 пикселя

int x_off,y_off, х,у, index;

char far *sprite_data;

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

sprite->frames[sprite_frame] = (char far *)malloc(SPRITE_WIDTH * SPRITE_HEIGHT);

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

// для ускорения доступа

sprite_data = sprite->frames[sprite_frame];

// теперь перемещаем битовый образ спрайта из области PCX-файла

// в выделенную память

// мы должны выбрать, какой именно спрайт мы копируем

// помните, что в действительности файл представляет собой массив.

// 12х8 элементов, каждый из которых имеет размер 24х24 пикселя.

// Индекс (0,0) соответствует верхнему левому углу спрайта,

// (11,7) - нижнему правому

х_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 делает все перечисленное.








Date: 2015-09-18; view: 26; Нарушение авторских прав

mydocx.ru - 2015-2017 year. (0.015 sec.) - Пожаловаться на публикацию