Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming / GameProg / RPG_Programming_2ed.pdf
Скачиваний:
243
Добавлен:
12.02.2016
Размер:
12.06 Mб
Скачать

Глава 6. Создаем ядро игры

BOOL Save(char *Filename);

 

// Запись буфера в файл

void

*Load(char *Filename, unsigned

long *Size); // Загрузка

void

*GetPtr();

//

Получение указателя

unsigned long GetSize();

//

на буфер данных

//

Получение размера данных

};

Как видите, класс cDataPackage остался тем же самым (чтобы посмотреть на использование класса cDataPackage, обратитесь к главе 1).

Графическое ядро

Вы добрались до серьезного материала! Графическое ядро составляет значительную часть ядра игры и является самым большим и сложным объектом ядра, который мы рассмотрим. Возможности классов графического ядра представлены в таблице 6.1.

Таблица 6.1. Компоненты графического ядра

Класс

Описание

 

 

cGraphics

Обеспечивает инициализацию Direct3D, включение

 

режимов визуализации, установку текстур, материалов и

 

освещения.

cTexture

Хранит одну текстуру и предоставляет функции для

 

рисования двухмерных фрагментов текстуры на экране.

cMaterial

Хранит описание одного материала.

cLight

Хранит описание одного источника света.

cFont

Служит оберткой для объекта ID3DXFont о котором

 

говорилось в главе 2, «Рисование с DirectX Graphics».

cVertexBuffer

Упрощает работу с буферами вершин.

cWorldPosition

Управляет матрицей мирового преобразования,

 

позволяя вам быстро позиционировать, масштабировать

 

и вращать объекты.

cCamera

Содержит матрицу преобразования вида, которую можно

 

изменять через интерфейс объекта.

cMesh

Содержит список сеток, загруженных из X-файла и их

 

материалов. Используйте этот класс вместе с классом

cObject

cObject.

Представляет один объект в трехмерном мире.

 

Управляет ориентацией объекта, сеткой и состоянием

 

анимации.

cAnimation

Содержит список анимаций, загруженных из X-файла.

 

Используйте этот класс вместе с классом cObject.

304 netlib.narod.ru

Джим Адамс

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

классов каждого объекта ядра игры самодокументируемы, поэтому внимательно читайте их. Вы можете начать с cGraphics — прародителя

всех объектов графического ядра.

Графическая система и cGraphics

Вы используете cGraphics для установки видеорежимов, режимов визуализации, очистки устройства и многого другого. Как только объект cGraphics инициализирован, вы используете его совместно с почти

каждым классом компонента графического ядра. Взгляните на объявление cGraphics:

class cGraphics

 

{

 

protected:

// Дескриптор родительского окна

HWND m_hWnd;

IDirect3D9 *m_pD3D;

// Объект Direct3D

IDirect3DDevice9 *m_pD3DDevice; // Объект устройства

ID3DXSprite *m_pSprite; // Объект двухмерного спрайта

D3DDISPLAYMODE m_d3ddm; // Свойства видеорежима

BOOL m_Windowed;

// Флаг

включения оконного режима

BOOL m_ZBuffer;

 

// Флаг

использования Z-буфера

BOOL m_HAL;

 

// Флаг

аппаратного ускорения

long m_Width;

//

Ширина

для видеорежима

long m_Height;

//

Высота

для видеорежима

char m_BPP;

//

Количество бит в пикселе

char m_AmbientRed;

// Красная составляющая фонового света

char m_AmbientGreen;

// Зеленая составляющая фонового света

char m_AmbientBlue;

// Синяя составляющая фонового света

public:

 

cGraphics(); // Конструктор

~cGraphics(); // Деструктор

// Функции для получения COM-интерфейсов

IDirect3D9 *GetDirect3DCOM();

IDirect3DDevice9

*GetDeviceCOM();

ID3DXSprite *GetSpriteCOM();

BOOL Init();

// Инициализация графического объекта

BOOL Shutdown();

// Завершение работы графического объекта

// Инициализация

видеорежима по указанным параметрам

BOOL SetMode(HWND

hWnd, BOOL Windowed = TRUE,

BOOL

UseZBuffer = FALSE,

long

Width = 0, long Height = 0,

char

BPP = 0);

//Функции возвращают количество видеорежимов

//и информацию о них

netlib.narod.ru

305

Глава 6. Создаем ядро игры

long GetNumDisplayModes(D3DFORMAT

Format);

BOOL GetDisplayModeInfo(long Num,

D3DDISPLAYMODE *Mode),

D3DFORMAT

Format);

//Возвращает количество бит в пикселе

//для заданного видеорежима

char GetFormatBPP(D3DFORMAT Format);

//Смотрит, существует ли указанный видеорежим.

//Задайте Format и Windowed, затем установите HAL

//в TRUE для проверки аппаратного ускорения или

//в FALSE для проверки эмуляции

BOOL CheckFormat(D3DFORMAT Format, BOOL Windowed, BOOL HAL);

BOOL Display();

//

Отображает

вторичный буфер

 

//

(выполняя переключение страниц)

BOOL BeginScene();

//

Вызывается

перед началом визуализации

BOOL EndScene();

//

чего-либо

 

//

Вызывается, когда все визуализировано

BOOL BeginSprite(); //

Вызывается

чтобы разрешить рисование спрайтов

BOOL EndSprite();

//

Вызывается

для завершения рисования спрайтов

// Функции для очистки

экрана и/или Z-буфера

BOOL Clear(long Color = 0, float ZBuffer = 1.0f);

BOOL ClearDisplay(long Color = 0);

1.0f);

BOOL ClearZBuffer(float ZBuffer =

//Функции для получения размеров экрана и количества бит в пикселе long GetWidth();

long GetHeight(); char GetBPP();

//Функции для проверки наличия аппаратного ускорения и Z-буфера

//Используются только после установки видеорежима

BOOL GetHAL();

BOOL GetZBuffer();

// Установка нового преобразования перспективы

BOOL SetPerspective(float FOV=D3DX_PI/4, float Aspect=1.3333f,

float Near=1.0f, float Far=10000.0f);

//Функции для установки мирового преобразования

//и преобразования вида

BOOL SetWorldPosition(cWorldPosition *WorldPos);

BOOL SetCamera(cCamera *Camera);

// Функции для установки текущих света, материала и текстуры

BOOL SetLight(long Num, cLight *Light);

BOOL SetMaterial(cMaterial *Material);

BOOL SetTexture(short Num, cTexture *Texture);

//Установка и получение компонент фонового освещения

BOOL SetAmbientLight(char Red, char Green, char Blue); BOOL GetAmbientLight(char *Red, char *Green, char *Blue);

//Включение или выключение заданного источника света (0-n) BOOL EnableLight(long Num, BOOL Enable = TRUE);

//Включение и выключение освещения, z-буферизации,

306

netlib.narod.ru

Джим Адамс

//альфа-смешивания и альфа-проверки. Для смешивания указываются

//необязательные функции смешивания

BOOL EnableLighting(BOOL Enable = TRUE);

BOOL EnableZBuffer(BOOL Enable = TRUE);

BOOL EnableAlphaBlending(BOOL Enable = TRUE,

DWORD Src = D3DBLEND_SRCALPHA, DWORD Dest = D3DBLEND_INVSRCALPHA);

BOOL EnableAlphaTesting(BOOL Enable = TRUE);

};

С cGraphics вы можете сделать многое, но все начинается с вызова cGraphics::Init. Потом вы можете перечислить различные видеорежимы, или перескочить и вызвать cGraphics::SetMode, чтобы

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

ПРИМЕЧАНИЕ

Функция cGraphics::SetMode очень талантлива. Она

 

определяет есть ли поддержка аппаратного ускорения и

 

Z-буфера. Если эти возможности отсутствуют, функция

 

SetMode будет использовать предоставляемую Direct3D

 

программную эмуляцию функций трехмерной графики и

 

отключит Z-буфер, чтобы гарантировать установку режима.

 

 

Если вы хотите использовать полноэкранный режим, то должны присвоить параметру Windowed значение FALSE и указать допустимые значения Width, Height и количества бит в пикселе (BPP). Если какомуто из этих параметров вы присвоите 0, SetMode будет использовать

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

изменены в соответствии с новыми значениями.

Теперь вы можете недоумевать, что делать дальше. Перед тем, как что-

либо визуализировать, вы должны вызвать функцию cGraphics::BeginScene. После того, как визуализация закончена, вызовите cGraphics::EndScene. Затем вызовите cGraphics::Display для отображения вашей графики.

Хотите очищать экран перед визуализацией? Делайте это с помощью

трех функций очистки. Теперь вы можете включать источники света, материалы и текстуры (как показано в этом разделе), — cGraphics

работает так, как я описал в главе 2, так что здесь вас ничто не должно пугать.

ВНИМАНИЕ! Если вы не используете Z-буфер, не вызывайте функцию

Clear, поскольку она получает значение для Z-буфера. Вместо нее используйте функцию ClearDisplay.

Для установки и включения освещения вы вызываете функцию EnableLighting. Альфа-смешивание позволяет добиться потрясающих

результатов, и вы можете задавать необходимые коэффициенты смешивания

netlib.narod.ru

307

Соседние файлы в папке GameProg