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

#include <d3d9.h>
#include <d3dx9.h>
</source>
[/code]
 
Объявим глобальные переменные которые мы будем использовать в нашей программе.
[code<source lang="cpp]">
//Глобальные переменные
HINSTANCE g_hInstance = NULL; //Дескриптор приложения
IDirect3D9 *g_pDirect3D = NULL; //Интерфейс для создания устройства рендеринга
IDirect3DDevice9 *g_pDirect3DDevice = NULL; //Интерфейс устройства рендеринга
</source>
[/code]
 
Теперь объявим прототипы функций, которые мы с вами напишем.
[code<source lang="cpp]">
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow); //Точка старта приложения
long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);//Обработчик сообщений
void DrawFrame(); //Рисуем кадр
void Shutdown(); //Освобождаем память
</source>
[/code]
 
Поговорим о функции WinMain. Эта функция является точкой старта приложения, код который в ней написан начинает выполнение при запуске программы. В этой функции мы должны создать окно и отобразить его.
[code<source lang="cpp]">
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
return 0; //Завершаем работу приложения
}
</source>
[/code]
 
Теперь мы должны написать функцию которая у нас будет обрабатывать сообщения, принцип действия этой функции таков: если мы получили сообщения - перехватываем его, и делаем действия которые нам требуются.
[code<source lang="cpp]">
long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
return DefWindowProc(hWnd,iMsg,wParam,lParam); //Если нету для нас нужных сообщений, пусть это обрабатывает виндовс
}
</source>
[/code]
 
Сейчас наша задача написать функцию инициализации Direct3D. Эта тема для вас новая, постарайтесь сосредоточиться и внимательно просмотреть код.
[code<source lang="cpp]">
bool InitDirect3D(D3DFORMAT ColorFormat,D3DFORMAT DepthFormat)
{
return false; //Возвращяем false
}
</source>
[/code]
 
Приступим к написанию функции, которая будет рисовать кадры. У устройства рендеринга есть свои недостатки - потеря устройства. потеря устройства возникает например в случаях когда полноэкранное окно не в фокусе и тд. После того как мы потеряли устройство надо его востановить, чтобы дальше можно было отображать сцену.
[code<source lang="cpp]">
void DrawFrame()
{
g_pDirect3DDevice->Present(NULL,NULL,NULL,NULL);//Отображаем весь задний буфер
}
</source>
[/code]
 
Ну и последняя функция, которая будет освобождать выдуленеую память. Освобождать память надо в обратном порядке выделения памяти.
[code<source lang="cpp]">
void Shutdown()
{
g_hInstance = NULL; //Устанавливаем дескриптор приложения в ноль
}
</source>
[/code]
 
Теперь компилируем и смотрим что получилось)
17

правок