DirectX 8. Начинаем работу с DirectX Graphics

на главную

Жанры

Поделиться:

DirectX 8. Начинаем работу с DirectX Graphics

Шрифт:

GameDev.ru

DirectX 8: Начинаем работу с DirectX Graphics

Автор: voxatu

(пример написан на основе первого "родного" туториала к DirectX SDK 8.0)

Ну, наконец-то мы дошли до самой сути, а именно - до начала работы непосредственно с DirectX! Сейчас напишем вместе прогу, которая создаст класс, окошко, инициализирует объекты Direct3D и… в итоге у нас получится — сами увидите что :-) Советую

СКАЧАТЬ ПРИМЕР в архиве и читать дальше, имея исходники перед глазами. Чтобы открыть пример, необходимо сначала разархивировать его в отдельную директорию, затем нажать File->Open Workspace и открыть файл "D3D Init.dsw" из этой директории. Ну… поехали.

Сначала необходимо написать include'ы, описать глобальные переменные, которые мы будем использовать в программе, а также объявить прототипы функций:

//Включаем все функции, необходимые для работы с D3D.

//<windows.h> уже включен в этом файле

#include <d3d8.h>

#include <stdio.h> //В дальнейшем нам понадобится функция sprintf

LPDIRECT3D8 g_pD3D = NULL; //Понадобится нам, чтобы создать D3DDevice

//Это наше устройство rendering'а (Rendering Device)

LPDIRECT3DDEVICE8 g_pd3dDevice = NULL;

WNDCLASSEX wclass;

//Объявляем прототипы функций

VOID Init(HWND); //Инициализация D3D

VOID Render; //Рендеринг сцены

VOID Sweep; //Очистка после выполнения программы

//Обработка сообщений, поступивших окну

LRESULT CALLBACK MessageProc(HWND, UINT, WPARAM, LPARAM);

Что же такое Render? "Render" с английского переводится как: "переводить", "просчитывать", "визуализировать". Все объекты, которые находятся на нашей виртуальной сцене, хранятся в памяти в виде отдельных блоков: источники света, каркас, состоящий из вершин (точка в 3-D пространстве), текстуры, и т.д. Но видеокарта не может все это показать на экране, т.к. может вывести только последовательность разноцветных точек. Rendering Device как раз и выполняет эту функцию, т.е. преобразует всю нашу сцену в "понятный" для видеокарты вид.

В своих статьях я не буду переводить некоторые английские термины на русский язык, а буду их "руссифицировать" (например, я не буду переводить "rendering device", как "делательное устройство" или "устройство просчёта", а буду просто говорить "устройство рендеринга" или вообще "девайс для рендеринга" (всякое может случиться %) )). Дело не в том, что я не могу подобрать тому или иному английскому термину русский эквивалент. Просто иногда лучше пользоваться "родными" названиями (мы же не называем "Visual C" Визульным Си =-)). Едем дальше…

В нашей программе будет пять функций: функция WinMain, Init, Render, Sweep и функция обработки сообщений MessageProc. Каждая функция представляет собой некий блок программы, который выполняет исключительно свою операцию. Например Init будет инициализировать Direct3D (в дальнейшем, просто D3D), Render —

рендерить сцену, а Sweep — производить очистку после выполнения программы. Я постарался, как можно больше упростить программу, поэтому урезал некоторые моменты (например, обработку ошибок, которые могут возникнуть при инициализации). В последующих программах мы будем стараться "честно" учитывать все возможные ошибки и обрабатывать их. Итак, рассмотрим подробнее, что же делают наши функции.

Функция WinMain

Самая главная функция. Именно с нее начинается выполнение любой программы, написанной под Windows. В нашем случае она делает вот что:

Описываем переменные.

HWND hWnd; //Handle окна

MSG msg;

Затем идет настройка параметров класса, регистрация класса в системе и создание окна, представляющего этот класс.

//Настраиваем параметры класса wclass перед его регистрацией в системе

wclass.cbSize=sizeof(wndclassex);

wclass.style=CS_DBLCLKS;

wclass.lpfnWndProc=&MessageProc;

//Функция обрабатывающая сообщения

wclass.cbClsExtra=0;

wclass.cbWndExtra=0;

wclass.hInstance=hInst;

wclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);

wclass.hCursor=LoadCursor(NULL, IDC_ARROW);

wclass.hbrBackground=GetSysColorBrush(COLOR_APPWORKSPACE);

wclass.lpszMenuName=NULL;

wclass.lpszClassName="InitClass";

wclass.hIconSm=NULL;

//Выходим, если не удалось зарегистрировать класс

if (!RegisterClassEx(&wclass)) return 0;

//Теперь создадим окно и занесем его handle в hWnd

hWnd =

 CreateWindow("InitClass", "D3D Init", WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX, 100, 100, 420, 300, NULL, NULL, hInst, NULL);

Подробное описание структуры WNDCLASSEX и параметров функции CreateWindow смотри в статье JM'а "Введение в программирование под Windows". Стоит обратить внимание на то, что мы после всех манипуляций будем иметь в hWnd дескриптор окна, в котором затем сможем отображать нашу сцену.

Теперь обратимся к функции инициализации D3D:

Init(hWnd);

Остается только показать на экране наше окно

ShowWindow(hWnd, nCmdShow);

//Рисуем окошко

UpdateWindow(hWnd);

и организовать цикл обработки сообщений окну

while (GetMessage(&msg, NULL, 0, 0)) //Цикл обработки сообщений

{

 TranslateMessage(&msg);

 DispatchMessage(&msg);

Комментарии:
Популярные книги

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Пенсия для морского дьявола

Чиркунов Игорь
1. Первый в касте бездны
Фантастика:
попаданцы
5.29
рейтинг книги
Пенсия для морского дьявола

На изломе чувств

Юнина Наталья
Любовные романы:
современные любовные романы
6.83
рейтинг книги
На изломе чувств

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Законы Рода. Том 9

Flow Ascold
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец

Огненный князь 4

Машуков Тимур
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 4

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор