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

Листинг 5.14. Сохранение фона под спрайтом.

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


Читайте также:
  1. Вихрь (ритм-пространство-время) выполняет функцию сил притяжения и отталкивания, отвечая за сохранение форм.
  2. Листинг 11.2. Структура данных игрока.
  3. Листинг 11.3. Функции полета мухи.
  4. Листинг 11.4. Муравейник (ANTS.С).
  5. Листинг 11.5. Падение мяча (BALL.C).
  6. Листинг 11.6. Идеальный газ (GAS.C).
  7. Листинг 12.2. Шпионим за часами (SPY.C)._________________

void Behind_Sprite(sprite_ptr sprite)

{ // функция сохраняет область видеопамяти, в которую будет

// выводиться спрайт

char far *work_back;

in work_offset=0,offset,y;

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

work_back = sprite->background;

// вычисляем смещение в видеобуфере

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


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

{

// копируем строку видеопамяти в буфер

_fmemcpy((char far *)&work_back[work_offset], (char far *)&video_buffer[offset], SPRITE_WIDTH);

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

offset += SCREEN_WIDTH;

work_offset += SPRITE_WIDTH;

} // конец цикла for

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

Функция Behind_Sprite считывает матрицу размером 24х24, где должен находится спрайт. Данные после считывания находятся в поле background структуры спрайта. Это поле является указателем на область памяти, где находится спрайт.

Собственно, это все, что нам нужно для создания и перемещения маленьких образов по экрану. Для анимации мы должны изменять поле curr_frame в структуре спрайта, перед тем, как его начать рисовать. Мы обсудим процесс анимации в этой главе, но, я думаю, вы и сами догадываетесь, как это сделать: надо стереть спрайт, передвинуть его, снова нарисовать и т. д. Вот и все.

Отображение текста

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

Поскольку наши игры будут работать в графическом режиме, то единственный способ напечатать текст на экране - это выводить его по точкам. Мы можем нарисовать все 128 символов и загружать их из PCX-файла, но боюсь, что это похоронит все наши дальнейшие планы. Я бы лучше использовал битовые образы внутреннего набора символов, скрытые в памяти ПК. Если бы мы знали их местоположение, то смогли бы их использовать для вывода символов и надписей любого цвета и размера. Не верите? Ладно, я знаю, как это сделать, и сейчас научу вас.

Данные для таблицы символов ROM размером 8х8 начинаются с адреса F000:FA6E. Символы располагаются в ASCII-последоватедьности, то есть описание символа А находится на 65-м месте и т. д. Каждый символ состоит из восьми байт, где каждый байт представляет собой одну строку битовой карты символа. Мы можем умножить 65 на 8, чтобы найти смещение первого байта данных в наборе символов. Это смещение затем складывается с базовым адресом FOOO:FA6E, и следующие восемь байт представляют каждую из строк символа. Давайте посмотрим на рисунок 5.13 для большей ясности.

Единственная проблема режиме в 13h, которая у нас возникает, заключается в том, что для каждого пикселя требуется не один бит, а целый байт, в то время как каждая строка любого символа описывается байтом! И ничего с этим не сделать. Мы можем только окрашивать символы определенным цветом.

Алгоритм выглядит примерно так:

§ Получить следующую строку данных символа (следующий байт);

§ Нарисовать по горизонтали восемь точек, где пиксели с 0 по 7 установлены либо в 1, либо в 0, в зависимости от значения битов 0 - 7 в байте данных;


§ Проделать то же самое для каждой строки данных символа (байта).

Листинг 5.15 содержит код для изображения символа любого цвета в любой позиции на экране.


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


<== предыдущая страница | следующая страница ==>
Листинг 5.13. Функция рисования спрайта.| Листинг 5.15. Отображение символа.

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