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

Листинг 5.10. Программа чтения файла формата PCX.

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


Читайте также:
  1. I. Правила чтения
  2. I. УЧЕБНАЯ ПРОГРАММА ДИСЦИПЛИНЫ
  3. II Программа сроки и место проведения Форума
  4. Quot;ACX" Прогрессивное линейное позиционирование без чтения
  5. Quot;CX": случайное позиционирование без чтения
  6. V. ПРОГРАММА СОРЕВНОВАНИЙ
  7. VII. Программа проведения работ и ее обоснование

// размеры экрана

#define SCREEN_WIDTH 320

#define SCREEN_HEIGHT 200

// структура для хранения данных PCX файла

typedef struct pcx_picture_typ

{

pcx_header header; // заголовок файла (длина 128 байт)

RGB_color palette[256]; // палитра

char far *buffer; // буфер для размещения изображения

// после декомпрессии

} pcx_picture, *pcx_picture_ptr;

void PCX Load(char *filename,

pcx_picture_ptr image,int enable_palette)

{

// функция загружает данные из PCX-файла в структуру pcx picture

// после декомпрессии байты изображения помещаются в буфер.

// Отдельные элементы изображения выделяются позднее. Также

// загружается палитра и заголовок

FILE *fp;

int num_bytes,index;

long count;

unsigned char data;

char far *temp_buffer;

// открыть файл

fp = fopen(filename,"rb");

// загрузить заголовок

temp_buffer = (char far*)image;

for (index=0; index<l28; index++)

{

temp_buffer[index] = getc(fp);

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

// загрузить данные и декодировать их в буфере

count=0;

while (count<=SCREEN_WIDTH * SCREEN_HEIGHT}

{

// получить первую часть данных

data = getc(fp);

//это RLE?

if (data>=192 &&data<=255)

{

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

num_bytes = data-192;

//читаем байт цвета

data = getc(fp);

// повторяем байты в буфере num_bytes раз

while(num_bytes-->0)

{

image->buffer[count++] = data;

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

} // конец оператора if

else

{

// помещаем данные в следующую позицию буфера

image->buffer[count++] = data;

} // конец оператора else

} // конец чтения байт изображения

// перейти в позицию, не доходя 768 байт от конца файла

fseek(fp,-768L,SEEK_END);

// читаем палитру и загружаем ее в регистры VGA

for (index=0; index<256; index++)

{

// красная составляющая

image->palette[index].red = (getc(fp) >> 2);

// зеленая составляющая

image->palette[index].green = (getc(fp) >> 2);

// синяя составляющая

image->palette[index].blue = (getc(fp) >> 2);

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

 

fclose(fp);

// если флаг enable_palette установлен, меняем палитру

// на загруженную из файла

if (enable_palette)

{

for (index=0; index<256; index++)

{

Set_Palette_Register(index,

(RGB_color_ptr)&image->palette[index]);

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

} // конец установки новой палитры

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

Функция PCX_Load() — это сердце всей программы. Она загружает PCX-файл, декодирует его в буфере и загружает палитру. Каждый PCX-файл имеет свою собственную палитру в конце файла и я думаю, что вы сами можете добавить возможность загрузки повой палитры в таблицу соответствия цветов.

Функция выполняет именно те действия, которые-мы с вами уже обсуждали и ничего больше:

§ Открывает PCX-файл;

§ Читает заголовок;

§ Загружает PCX-файл и декомпрессирует все 64000 пикселей;

§ Загружает цветовую палитру.

В общем, все это несложно. А вот что делать с картинками, которые больше, чем целый экран? Ответ прост: можно декодировать только маленький кусочек, скажем 24 на 24 пикселя.

Я создал для вас заготовку CHARPLATE.PCX, которую вы найдете на прилагаемом диске. Если вы посмотрите на него, то увидите множество маленьких белых квадратов. Вы можете использовать этот шаблон для рисования ваших игровых персонажей в этих квадратиках.

Кстати, впоследствии мы научимся извлекать битовые образы из больших PCX-файлов и использовать их в качестве персонажей игры.

Возникает вопрос: «Как редактировать PCX-файлы в режиме 320х200х 256?» Для этого можно воспользоваться такими условно-бесплатными программами как VGA-Paint или Pro-Paint. Тем не менее, я надеюсь, что самые расторопные читатели уже давно пользуются копией Electronic Art's Deluxe Paint & Animation. Это одна из самых классных программ для рисования на ПК. Она корректно работает с режимом 320х200х256 и имеет множество полезных функций для преобразования и анимации изображения.

Побитовое копирование изображения (бит-блиттинг)

Термин бит-блиттинг (bit blitting) — означает процесс перемещения группы битов (образа) из одного места экрана в другое. В играх для ПК нас интересует перемещение образа из области хранения вне экрана в область видеобуфера. Давайте посмотрим на рисунок 5.9, чтобы уяснить сущность этой операции.

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

Чтобы понять суть перемещения, нам следовало бы написать несколько функций, которые бы брали битовую карту из PCX-файла и перемещали ее на экран. Но я хочу проявить некоторую «авторскую вольность» и поговорить о спрайтах и их анимации.

Спрайты

Вы можете спросить: «Что такое спрайт?». Знаете, есть такой газированный напиток... Снова шучу. На самом деле спрайты - это такие маленькие объектики, которые находятся на игровом поле и могут двигаться. Этот термин


прижился с легкой руки программистов фирмы Atari и Apple в середине, 70-х годов. Теперь поговорим о спрайтах и их анимации. В будущем мы еще вернемся к этой теме в седьмой главе, «Продвинутая битовая графика и специальные эффекты. Именно с этой мыслью я создал несколько небольших спрайтов, которые мы будем использовать в дальнейшем.

Спрайты - это персонажи в играх для ПК, которые могут без труда перемещаться по экрану, изменять цвет и размер. Все это звучит как мечта программиста. Но надо помнить, что в IBM-совместимых компьютерах нет спрайтов! Во нормальных компьютерах существует аппаратная поддержка спрайтов. Такие машины как Atari, Amiga, Commodore и последние модели Apple имеют эту возможность, а вот ПК - нет. Поэтому мы вынуждены делать это самостоятельно.

М-да. Нам будет чем заняться.

Конечно, мы не станем заниматься разработкой аппаратной поддержки спрайтов. Все, что нам нужно, это понять, каким образом помещать образ на экран, сохраняя при этом возможность его перемещений и видоизменений. Поскольку спрайт — это довольно сложный объект, то стоит подумать о том, как это реализовать на программном уровне. Мы вовремя об этом заговорили:. вспомните разработку игры «Астероиды».

Вот что нам надо:

§ Мы должны уметь извлекать матрицу пикселей из загруженного РСХ-образа и сохранять ее в буфере, связанном со спрайтом;

§ Более того, хотелось бы считывать сразу несколько образов из PCX-файла и загружать их в массив, связанный с одним спрайтом. Это позволит нам оптимизировать программу по скорости выполнения.

Рисунок 5.10 показывает последовательность кадров, которые приводят в движение ковбоя. Мы воспользуемся ею позже.

После того как мы загрузим данные из PCX-файла, нам необходимо иметь возможность показывать спрайт в любой позиции на экране. Делать это нужно осторожно, поскольку запись пикселей в видеобуфер разрушает то, что было на их месте. Поэтому, мы должны уметь сохранять ту часть изображения, которая окажется закрыта спрайтом, чтобы в дальнейшем иметь возможность восстано­вить первоначальный вид экрана.

Давайте на этом Месте остановимся и поговорим чуть-чуть об анимации. В играх для ПК применяется два способа обновления экрана:

§ Мы можем перерисовывать весь экран целиком, как это сделано; в игре Wolfenstein 3D;

§ Можно перерисовывать лишь участки экрана.

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

Давайте рассмотрим способ, которым мы будем пользоваться в настоящей главе - это перерисовка участков экрана. Посмотрите на рисунок 5.11, чтобы представить последовательность событий, позволяющих спрайту правильно перемещаться по экрану.

Теперь, когда мы знаем что делать, надо попробовать это реализовать. Для начала создадим структуру данных спрайта. Листинг 5.11 содержит необходимый для этого код.


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


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

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