Во-первых, нам нужно подключить библиотеки DirectX8, ниже следующий код ставим после подключения библиотеки windows.h:
#include <d3d8.h> #pragma comment (lib, "d3d8.lib")
тем самым мы можем воспользоваться функциями Direct3D: инициализируем пару структур, которые будут отвечать в целом за Direct3D, их тоже ставим в самое начало кода, но после подключения всех библиотек:
LPDIRECT3D8 p_d3d = NULL; // наш главный интерфейс d3d8 LPDIRECT3DDEVICE8 p_d3d_Device = NULL; // наше устройство d3d8
Без указателя p_d3d у нас ничего не выйдет, он обязательно нужен, чтобы инициализировать Direct3d. Указатель p_d3d_Device нужен для работы с графикой.
В функцию AppInit, после строки UpdateWindow (hWnd); добавляем следующий код:
p_d3d = Direct3DCreate8 (D3D_SDK_VERSION); D3DDISPLAYMODE d3ddm; p_d3d->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &d3ddm); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory (&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = true; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format; p_d3d->CreateDevice<&&/local&&> (<&&llink dxhelp 2&&>D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &p_d3d_Device);
Direct3DCreate8 создает объект Direct3D и присваивает адрес указателю p_d3d. Затем мы получаем режим адаптера, в котором он сейчас работает (Direct3D у нас создался) и заносим все его параметры в структуру d3ddm. Структура d3dpp содержит в себе параметры заднего буфера (т.е. та часть экрана, которую мы не видим, но увидим позже). При помощи функции ZeroMemory данный буфер заполняем нулями, чтобы в нем не было мусора. Если Windowed истинный (включен) то данное приложение воспринимать как оконное, если нет (false), то полноэкранным (им мы воспользуемся позже). D3DSWAPEFFECT_DISCARD говорит о том, что мы будем данному приложению сообщать о времени, когда можно использовать буфер для заполнения нашими параметрами. Строка d3dpp.BackBufferFormat = d3ddm.Format; в данном случае нужна, потому что у нас, как мы ранее поставили, оконный режим и должен соответствовать формату текущего показа. А далее создаем устройство при помощи функции CreateDevice принадлежащий главному интерфейсу. Параметр D3DADAPTER_DEFAULT говорит, что используется первичный адаптер. Второй параметр в качестве желательного устройства несет D3DDEVTYPE_HAL - используем ускоритель и программный эмулятор, в случае если ускоритель не поддерживает функций. D3DCREATE_SOFTWARE_VERTEXPROCESSING - определяет средства обработки вершин. Дальше присваиваем адрес буфера и адрес устройства представляемому устройству, который будет использовать эти структуры.
Ну вот, с инициализацией покончили, все назначили, а как мы назначили, так мы должны и удалить все это корректно, добавьте в функцию WinMain после всего цикла while:
DestroyDirect3D8 ();
Эту функцию писать нужно нам, т.к. Direct3D об этом не заботится и мы ее напишем, смотрите ниже:
//--------------------------- // Name: DestroyDirect3D8 () // Desc: //--------------------------- void DestroyDirect3D8 (void) { _RELEASE_ (p_d3d_Device); _RELEASE_ (p_d3d); };
Можете расположить после "функции показа и обновления окна" (забыли? см. "Шаг 1 - Инициализация оконного приложения", какая функция за это отвечает ;)
Подводим итоги: мы инициализировали DirectDraw и Direct3D одновременно, но на деле ничего не изменилось, все тоже окно, а столько кода написали... Но ничего, дальше мы начнем писать код, где наш глаз уже заметит изменения на мониторе ;)