Программирование игр для Windows. Советы профессионала

Установка видеорежимов


В играх есть немало технических хитростей: работа со звуком, «искусственный интеллект» и многое другое. Но перед тем как начать этим заниматься, давайте попробуем инициализировать наш дисплей.

Конечно, мы сразу можем набрать гору документации с подробным описанием устройства дисплея, регистров и установок, но все это весьма опасно, и вот почему. То, что будет работать на одной видеокарте, может оказаться абсолютно неработоспособным на другой. Таким образом, чтобы избежать возможной несовместимости, для установки видеорежима мы будем использовать базовую систему ввода/вывода (BIOS).

Можно смело сказать, что основная графическая мощь ПК сосредоточена в прерывании с номером 10h. Использование этого прерывания весьма просто — необходимо правильно установить нужные регистры процессора в зависимости от выполняемой функции. В этой книге мы будем пользоваться режимом 13h (это графический режим с разрешением 320х200 точек, при 256 цветах). Теперь нам нужно найти, как перенести компьютер в этот режим. Для этого давайте напишем программу на ассемблере для установки режима 13h и программу на Си для проверки. Соответствующие фрагменты показаны в Листингах 2.8 и 2.9.

Листинг 2.8. Ассемблерная процедура, устанавливающая видеорежим (SETMODEA.ASM).

.MODEL MEDIUM, С     

;модель памяти - MEDIUM, соглашения языка Си

.CODE                 ;начало кодового сегмента

PUBLIC Set_Mode       ;объявляем функцию как общедоступную

Set_Mode PROC FAR С vmode:WORD ;функция получает один параметр

mov АН,0              ;функция 0 прерывания 10h - установка режима

mov AL,BYTE PTR vmode ;номер режима, который вы хотите установить

int 10h               ; используем BIOS для установки режима

ret                   ; возврат из процедуры



Set_Mode ENDP         ; конец процедуры

END                   ;конец кодового сегмента

Листинг 2.9. Си-функция, тестирующая видеорежим (SETMOPEC.C).

#include <stdio.h>

#define VGA256 0х13

#define TEXT_MODE  0х03

extern Set_Mode(int mode);

void main(void)

{

// устанавливаем режим 320х200 точек, 256 цветов

Set_Mode(VGA256);

// ждем нажатия любой клавиши

while (kbhit()) {}

// возвращаем компьютер в текстовый режим

Set_Mode(TEXT_MODE);

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

Теперь если вы наберете и запустите эти программы, то, скорее всего, увидите пустой экран. Правда, в данном случае это не означает «зависание» компьютера, а свидетельствует о том, что VGA-карта переключилась в режим 13h. Стоит только нажать любую клавишу, и вы вновь окажетесь в привычном текстовом режиме 80х25. Конечно, можно было бы использовать функцию _setvideomode() из графической библиотеки Microsoft С, но наша функция работает в сотни раз быстрее.

Теперь, когда мы научились переключать экран в графический режим, неплохо бы попробовать его очистить.



Содержание раздела