Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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

Листинг 4.11. Супер Астероиды (FIELD.C). | СЕКРЕТЫ VGA-КАРТ | Листинг 5.3. Создание новой цветовой палитры. | Листинг 5.4. Рисование точки в позиции (х,у). | Листинг 5.5. Программа быстрого рисования точки. | Листинг 5.6. Рисование горизонтальной линии. | Листинг 5.7. Рисование вертикальной линии. | Листинг 5.8. Создание и отображение цветовой палитры (PALDEMO.C). | Листинг 5.9. Структура заголовка PCX-файла. | Листинг 5.10. Программа чтения файла формата PCX. |


Читайте также:
  1. IV. Перепишите и переведите предложения, обращая внимание на употребление герундия в разных функциях.
  2. IV. Перепишите и переведите предложения, обращая внимание на употребление герундия в разных функциях.
  3. X. Прочитайте и переведите предложения, обращая внимание на употребление инфинитива в различных функциях.
  4. XIV. Прочитайте и переведите предложения, обращая внимание на употребление Participle I в разных функциях.
  5. XV. Прочитайте и переведите предложения, обращая внимание на употребление Participle II в разных функциях.
  6. Алгоритм 8.1. Масштабирование спрайта.
  7. Анализ процесса рисования

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). Если пиксель

// "непрозрачный" - выводим его на экран.

if ((data=work_sprite[work_offset+x])) video_buffer[offset+xj = data;

} // конец вывода строки

// перейти к следующему ряду пикселей в видеобуфере

//в буфере спрайта

offset += SCREEN_WIDTH;

work_offset += SPRITE_WIDTH;

} // коней вывода спрайта

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

Эта функция работает примерно так же, как и Plot_Pixel_Fast из Листинга 5.5. Сначала вычисляется стартовый адрес расположения спрайта, а затем все его байты строка за строкой переписываются в видеобуфер.

Следует учесть, что здесь потребуется некоторая оптимизация. Почему бы не использовать функцию memcpy, чтобы копировать всю строку разом (а всего 24 строки)? Однако этого сделать нельзя, так как при выводе спрайта нам необходимо применить технику, использующую "прозрачные" пиксели. Что это дает? Взгляните на рисунок 5.12.

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

Следующая функция, которую я собираюсь вам предложить, будет сохранять фон перед тем, как мы выведем спрайт на экран. Помните, когда мы что-то записываем в видеобуфер, данные или образ, находящийся там, обязательно теряются. Поэтому мы и должны сохранять фон под спрайтом прежде чем поместим его в видеобуфер, чтобы позже восстановить прежний вид экрана. Код в Листинге 5.14 именно это и делает.


Дата добавления: 2015-07-12; просмотров: 129 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Листинг 5.12. Функция извлечения спрайта из загруженного PCXфайла.| Листинг 5.14. Сохранение фона под спрайтом.

mybiblioteka.su - 2015-2024 год. (0.006 сек.)