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

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

(для приемника и для источника). Альфа-проверка помогает вам рисовать эти надоедливые прозрачные текстуры (как показано в главе 2).

Изображения и cTexture

Текстуры делают трехмерную графику ценящейся на вес золота. Плоские полигоны обретают жизнь с использованием полноцветных изображений.

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

class cTexture

 

 

{

 

 

protected:

//

Родительский cGraphics

cGraphics *m_Graphics;

IDirect3DTexture9 *m_Texture;

//

COM-интерфейс текстуры

unsigned long m_Width, m_Height; // Размеры текстуры

public:

cTexture(); // Конструктор ~cTexture(); // Деструктор

IDirect3DTexture9 *GetTextureCOM(); // Возвращает COM-интерфейс

// текстуры

// Загружает текстуру из файла

BOOL Load(cGraphics *Graphics, char *Filename, DWORD Transparent = 0,

D3DFORMAT Format = D3DFMT_UNKNOWN);

//Создает текстуру, используя указанные размеры и формат

BOOL Create(cGraphics *Graphics,

DWORD Width, DWORD Height, D3DFORMAT Format);

//Конфигурирует класс cTexture на основе существующего

//экземпляра объекта IDirect3DTexture9

BOOL Create(cGraphics *Graphics,

IDirect3DTexture9 *Texture);

BOOL Free();

// Освобождает объект текстуры

BOOL IsLoaded();

// Возврашает TRUE если текстура загружена

long GetWidth();

// Возвращает ширину (шаг) текстуры

long GetHeight();

//

Возвращает высоту

текстуры

D3DFORMAT GetFormat(); //

Возвращает формат

хранения текстуры

// Рисует двухмерный фрагмент текстуры на устройстве

BOOL Blit(long DestX, long DestY,

long SrcX = 0, long SrcY = 0, long Width = 0, long Height = 0,

float XScale = 1.0f, float YScale = 1.0f, D3DCOLOR Color = 0xFFFFFFFF);

};

Текстура в класс cTexture может быть загружена из двух источников:

из файла с изображением на диске или из существующего объекта IDirect3DTexture9. Если вы загружаете изображение с диска, вызовите cTexture::Load. Этой функции для работы требуется пара параметров:

308

netlib.narod.ru

Джим Адамс

во-первых, ранее инициализированный объект cGraphics, и, во-вторых, имя загружаемого файла с изображением.

Есть еще два необязательных аргумента — цветовой ключ для

прозрачности (если вы используете текстуры с прозрачными пикселями) и формат хранения. По умолчанию для Transparent используется значение

0, сообщающее функции Load, что прозрачные пиксели не используются. Предоставление значения типа D3DCOLOR_RGBA меняет ситуацию (убедитесь, что вы указали значение 255 для альфа-составляющей).

Когда используете Format, укажите формат хранения текстуры Direct3D, такой как D3DFMT_A1R5G5B5. Помните, что если у текстуры

есть прозрачные пиксели, у нее должен быть альфа-канал, так что убедитесь, что используете такой формат как D3DFMT_A1R5G5B5 или

D3DFMT_A8R8G8B8.

Наиболее вероятно, что вы будете использовать класс cTexture совместно с функцией cGraphics::SetTexture для рисования

текстурированных полигонов. С другой стороны, если вы используете

растровое изображение объекта текстуры для рисования непосредственно на экране, можно воспользоваться функцией cTexture::Blit, использующей специальный объект, называемый ID3DXSprite. Пока вы ничего не знаете про ID3DXSprite — мы познакомимся с ним в главе 7,

«Использование двухмерной графики».

Сейчас я покажу, как использовать функцию Blit. Вам необходимо

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

текстуры (называемой texture.bmp) и ее отображения на экране:

// g_Graphics = ранее инициализированный объект cGraphics cTexture Texture;

Texture.Load(&g_Graphics, "texture.bmp");

// Рисуем текстуру в точке экрана 0,0 (используя двухмерный метод)

Texture.Blit(0,0);

Texture.Free(); // Выгружаем текстуру из памяти

Цвета и cMaterial

В главе 2 обсуждалась важность использования материалов, меняющих визуальное представление визуализируемых объектов путем смены цвета

рисуемых граней. Чтобы вам было проще менять цвета материалов, воспользуйтесь классом cMaterial:

netlib.narod.ru

309

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

class cMaterial

{

protected:

D3DMATERIAL9 m_Material; // Структура данных материала

public:

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

D3DMATERIAL9 *GetMaterial(); // Возвращает объект D3DMATERIAL8

//Установка и получение рассеиваемой составляющей цвета

BOOL SetDiffuseColor(char Red, char Green, char Blue); BOOL GetDiffuseColor(char *Red, char *Green, char *Blue);

//Установка и получение фоновой составляющей цвета

BOOL SetAmbientColor(char Red, char Green, char Blue);

BOOL GetAmbientColor(char *Red, char *Green, char *Blue);

// Установка и получение отражаемой составляющей цвета

BOOL SetSpecularColor(char Red, char Green, char Blue); BOOL GetSpecularColor(char *Red, char *Green, char *Blue);

//Установка и получение испускаемой составляющей цвета

BOOL SetEmissiveColor(char Red, char Green, char Blue); BOOL GetEmissiveColor(char *Red, char *Green, char *Blue);

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

BOOL SetPower(float Power); float GetPower(float Power);

};

Как видите, класс cMaterial содержит одну структуру D3DMATERIAL9 и предоставляет функции для установки и получения

различных цветовых составляющих. Чтобы установить цветовую составляющую, укажите величины ее компонентов в диапазоне от 0 до 255. Для получения цветовой составляющей передайте соответствующей функции указатели на переменные типа char.

Вот пример использования cMaterial для создания желтого материала:

// g_Graphics = ранее инициализированный объект cGraphics cMaterial YellowMaterial;

YellowMaterial.SetDiffuseColor(255,255,0);

YellowMaterial.SetAmbientColor(255,255,0);

g_Graphics.SetMaterial(&YellowMaterial); // Установка материала

ПРИМЕЧАНИЕ

При создании экземпляра класса cMaterial происходит

 

очистка члена m_Material и создается полностью белый

 

материал.

 

Вы используете класс cMaterial совместно с функцией

 

cGraphics::SetMaterial

для установки текущего материала

 

визуализации.

 

 

 

310

netlib.narod.ru

Джим Адамс

Освещение с cLight

Источники света — простые игрушки, почти как материалы. С источниками света можно выполнять множество операций различными способами,

поэтому я оборачиваю все это (по крайней мере, все о чем вы прочитали в главе 2) в класс с именем cLight:

class cLight

{

protected:

D3DLIGHT9 m_Light; // Структура данных источника света

public:

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

D3DLIGHT9 *GetLight(); // Получение структуры данных источника света

BOOL SetType(D3DLIGHTTYPE Type); // Установка типа источника света:

// D3DLIGHT_POINT

// D3DLIGHT_SPOT

// D3DLIGHT_DIRECTIONAL

//Абсолютное или относительное перемещение //источника света из текущей позиции

BOOL Move(float XPos, float YPos, float ZPos); BOOL MoveRel(float XPos, float YPos, float ZPos);

//Получение текущей позиции источника света

//в указанные переменные

BOOL GetPos(float *XPos, float *YPos, float *ZPos);

//Установка абсолютного или относительного

//направления лучей света

BOOL Point(float XPos, float YPos, float ZPos);

BOOL PointRel(float XPos, float YPos, float ZPos);

//Получение текущего направления источника света

//в указанные переменные

BOOL GetDirection(float *XPos, float *YPos, float *ZPos);

// Установка и получение различных цветовых компонент

BOOL SetDiffuseColor(char Red, char Green, char Blue); BOOL GetDiffuseColor(char *Red, char *Green, char *Blue); BOOL SetSpecularColor(char Red, char Green, char Blue); BOOL GetSpecularColor(char *Red, char *Green, char *Blue); BOOL SetAmbientColor(char Red, char Green, char Blue); BOOL GetAmbientColor(char *Red, char *Green, char *Blue);

//Установка и получение дальности освещения

BOOL SetRange(float Range); float GetRange();

//Установка и получение значения затухания

BOOL SetFalloff(float Falloff); float GetFalloff();

//Установка и получение различных коэффициентов затухания

BOOL SetAttenuation0(float Attenuation);

float GetAttenuation0();

BOOL SetAttenuation1(float Attenuation);

netlib.narod.ru

311

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