Программируем игры на DirectX: различия между версиями

Содержимое удалено Содержимое добавлено
м Откат правок MrJaroslavik (обс.) к версии 176.59.16.70
Метка: откат
м <source> -> <syntaxhighlight> (phab:T237267)
Строка 4:
Для работы приложения нам потребуется использовать разные библиотеки, их мы сейчас и подключим к нашему проекту.
 
<sourcesyntaxhighlight lang="cpp">
//Подключаем библиотеки
#pragma comment(lib,"d3d11d.lib")
#pragma comment(lib,"d3dx11.lib")
#pragma comment(lib,"winmm.lib")
</syntaxhighlight>
</source>
 
Дальше мы должны подключить заголовочные файлы, чтобы компилятор не выдавал ошибки.
 
<sourcesyntaxhighlight lang="cpp">
//Подключаем заголовочные файлы
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
</syntaxhighlight>
</source>
 
Объявим глобальные переменные, которые мы будем использовать в нашей программе.
 
<sourcesyntaxhighlight lang="cpp">
//Глобальные переменные
HINSTANCE g_hInstance = NULL; //Дескриптор приложения
Строка 31:
IDirect3D9 *g_pDirect3D = NULL; //Интерфейс для создания устройства рендеринга
IDirect3DDevice9 *g_pDirect3DDevice = NULL; //Интерфейс устройства рендеринга
</syntaxhighlight>
</source>
 
Теперь объявим прототипы функций, которые мы с вами напишем.
 
<sourcesyntaxhighlight lang="cpp">
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow); //Точка старта приложения
long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);//Обработчик сообщений
Строка 41:
void DrawFrame(); //Рисуем кадр
void Shutdown(); //Освобождаем память
</syntaxhighlight>
</source>
 
Поговорим о функции WinMain. Эта функция является точкой старта приложения. Код, который в ней написан, начинает выполнение при запуске программы. В этой функции мы должны создать окно и отобразить его.
 
<sourcesyntaxhighlight lang="cpp">
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
Строка 121:
return 0; //Завершаем работу приложения
}
</syntaxhighlight>
</source>
 
Теперь мы должны написать функцию, которая у нас будет обрабатывать сообщения. Принцип действия этой функции таков: если мы получили сообщения — перехватываем его, и делаем действия которые нам требуются.
 
<sourcesyntaxhighlight lang="cpp">
long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
Строка 139:
return DefWindowProc(hWnd,iMsg,wParam,lParam); //Если нету для нас нужных сообщений, пусть это обрабатывает Windows
}
</syntaxhighlight>
</source>
 
Сейчас наша задача написать функцию инициализации Direct3D. Эта тема для вас новая, постарайтесь сосредоточиться и внимательно просмотреть код.
 
<sourcesyntaxhighlight lang="cpp">
bool InitDirect3D(D3DFORMAT ColorFormat,D3DFORMAT DepthFormat)
{
Строка 195:
return false; //Возвращаем false
}
</syntaxhighlight>
</source>
 
Приступим к написанию функции, которая будет рисовать кадры. У устройства рендеринга есть свои недостатки — потеря устройства. Потеря устройства возникает например в случаях, когда полноэкранное окно не в фокусе и т. д. После того как мы потеряли устройство надо его восстановить, чтобы дальше можно было отображать сцену.
 
<sourcesyntaxhighlight lang="cpp">
void DrawFrame()
{
Строка 219:
g_pDirect3DDevice->Present(NULL,NULL,NULL,NULL);//Отображаем весь задний буфер
}
</syntaxhighlight>
</source>
 
Ну и последняя функция, которая будет освобождать выделенную память. Освобождать память надо в обратном порядке выделения памяти.
 
<sourcesyntaxhighlight lang="cpp">
void Shutdown()
{
Строка 244:
g_hInstance = NULL; //Устанавливаем дескриптор приложения в ноль
}
</syntaxhighlight>
</source>
 
Теперь компилируем и смотрим что получилось.