Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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 делает все перечисленное.
|