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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Строка 5: Строка 5:
Создадим проект с именем Lesson1.
Создадим проект с именем Lesson1.
<source lang="cpp">
<source lang="cpp">
//Подключаем библиотеки
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"winmm.lib")

//Подключаем закголовчные файлы
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>

//Глобальные переменные
HWND g_hWnd = NULL; //Дескриптор окна
int g_iWindowWidth = 800; //Ширина окна
int g_iWindowHeight = 600; //Высота окна
bool g_bApplicationState = true; //Состояние приложения (true - работает/false - неработает)
bool g_bFullScreen = false; //Режим окна (true - полноэкранный/false - оконный)

//Прототипы функций
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow);
long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
{
WNDCLASSEX wc;
return 0;
wc.cbSize = sizeof(WNDCLASSEX); //Размер структуры
wc.style = CS_HREDRAW|CS_VREDRAW; //Стили класса окна
wc.lpfnWndProc = WndProc; //Функция обработки сообщений
wc.cbClsExtra = 0; //Количество выделяемой памяти при создании приложения
wc.cbWndExtra = 0; //Количество выделяемой памяти при создании приложения
wc.hInstance = hInstance; //Дескриптор приложения
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); //Загружаем стандартную иконку
wc.hCursor = LoadCursor(0,IDC_ARROW); //Загружаем стандартный курсор
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //Окно будет закрашено в белый цвет
wc.lpszMenuName = 0; //Не используем меню
wc.lpszClassName = "Lesson 1"; //Названия класса
wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION); //Загружаем стандартную иконку

if(!RegisterClassEx(&wc)) //Регестрируем класс в Windows
{
MessageBox(NULL,"Can`t register window class","Error",MB_OK|MB_ICONERROR); //Выводим сообщение
return 0; //Завершаем работу приложения
}

DWORD iWindowStyleEx = 0;
DWORD iWindowStyle = 0;

if(g_bFullScreen) //Если у нас поноэкранный режим
{
iWindowStyleEx = WS_EX_APPWINDOW;
iWindowStyle = WS_POPUP;
}
else
{
iWindowStyleEx = WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;
iWindowStyle = WS_OVERLAPPEDWINDOW;
}

g_hWnd = CreateWindowEx( //Создаем окно
iWindowStyleEx, //Расшыренный стиль окна
"Lesson 1", //Названия класса окна
"Lesson 1 - Create Window. Init Direct3D", //Названия окна
iWindowStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, //Стиль окна
0, //Позиция окна по оси Х
0, //Позиция окна по оси У
g_iWindowWidth, //Ширина окна
g_iWindowHeight, //Высота окна
NULL, //У нас это окно главное
NULL, //Нету меню
hInstance, //Дескриптор приложения
NULL); //Дополнительный настройек неиспользуем

if(g_hWnd == NULL) //Если не создали окно
{
MessageBox(NULL,"Can`t create window","Error",MB_OK|MB_ICONERROR); //Выводим сообщение
return 0; //Завершаем работу приложения
}

ShowWindow(g_hWnd,SW_SHOW); //Отображаем окно
UpdateWindow(g_hWnd); //Обновляем окно
SetFocus(g_hWnd); //Устанавливаем фокус на наше окно
SetForegroundWindow(g_hWnd); //Устанавливаем высший приоритет окна

MSG msg;
ZeroMemory(&msg,sizeof(msg));

while(g_bApplicationState)
{
if(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return 0; //Завершаем работу приложения
}
}


Строка 20: Строка 108:
case WM_DESTROY:
case WM_DESTROY:
{
{
g_bApplicationState = false;
PostQuitMessage(0);
return 0;
return 0;
}
}

Версия от 18:46, 28 ноября 2009

Введение

В этом учебнике я постараюсь научить вас программировать игры на языку С++ с помощью DirectX SDK. Программировать мы будем с вами для операционной системы Windows XP. В этом учебнике мы охватим такие важные темы как графика, музыка, физика, искусственный интеллект. Для применение полученных знаний мы напишем пару игр. Код используемый в книге был написан мною в среде Microsoft Visual C++ 6.0 с использованием DirectX SDK November 2009.

Урок 1 - Создание окна. Инициализация Direct3D

Создадим проект с именем Lesson1.

//Подключаем библиотеки
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

//Подключаем закголовчные файлы
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>

//Глобальные переменные
HWND g_hWnd = NULL;					//Дескриптор окна
int g_iWindowWidth = 800;			//Ширина окна
int g_iWindowHeight = 600;			//Высота окна
bool g_bApplicationState = true;	//Состояние приложения (true - работает/false - неработает)
bool g_bFullScreen = false;			//Режим окна (true - полноэкранный/false - оконный)

//Прототипы функций
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow);
long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{	
	WNDCLASSEX wc;
	wc.cbSize		 = sizeof(WNDCLASSEX);				//Размер структуры
	wc.style         = CS_HREDRAW|CS_VREDRAW;			//Стили класса окна
	wc.lpfnWndProc   = WndProc;							//Функция обработки сообщений
	wc.cbClsExtra    = 0;								//Количество выделяемой памяти при создании приложения
	wc.cbWndExtra    = 0;								//Количество выделяемой памяти при создании приложения
	wc.hInstance     = hInstance;						//Дескриптор приложения
	wc.hIcon         = LoadIcon(NULL,IDI_APPLICATION);	//Загружаем стандартную иконку
	wc.hCursor       = LoadCursor(0,IDC_ARROW);			//Загружаем стандартный курсор
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);	//Окно будет закрашено в белый цвет
	wc.lpszMenuName  = 0;								//Не используем меню
	wc.lpszClassName = "Lesson 1";						//Названия класса
	wc.hIconSm		 = LoadIcon(NULL,IDI_APPLICATION);	//Загружаем стандартную иконку

	if(!RegisterClassEx(&wc))							//Регестрируем класс в Windows
	{
		MessageBox(NULL,"Can`t register window class","Error",MB_OK|MB_ICONERROR); //Выводим сообщение
		return 0;										//Завершаем работу приложения
	}

	DWORD iWindowStyleEx = 0;
	DWORD iWindowStyle = 0;

	if(g_bFullScreen)									//Если у нас поноэкранный режим
	{
		iWindowStyleEx	= WS_EX_APPWINDOW;
		iWindowStyle	= WS_POPUP;
	}
	else
	{
		iWindowStyleEx	= WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;
		iWindowStyle	= WS_OVERLAPPEDWINDOW;
	}

	g_hWnd = CreateWindowEx(							//Создаем окно
		iWindowStyleEx,									//Расшыренный стиль окна
		"Lesson 1",										//Названия класса окна
		"Lesson 1 - Create Window. Init Direct3D",		//Названия окна
		iWindowStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,	//Стиль окна
		0,												//Позиция окна по оси Х
		0,												//Позиция окна по оси У
		g_iWindowWidth,									//Ширина окна
		g_iWindowHeight,								//Высота окна
		NULL,											//У нас это окно главное
		NULL,											//Нету меню
		hInstance,										//Дескриптор приложения
		NULL);											//Дополнительный настройек неиспользуем

	if(g_hWnd == NULL)									//Если не создали окно
	{
		MessageBox(NULL,"Can`t create window","Error",MB_OK|MB_ICONERROR); //Выводим сообщение
		return 0;										//Завершаем работу приложения
	}

	ShowWindow(g_hWnd,SW_SHOW);							//Отображаем окно	
	UpdateWindow(g_hWnd);								//Обновляем окно
	SetFocus(g_hWnd);									//Устанавливаем фокус на наше окно
	SetForegroundWindow(g_hWnd);						//Устанавливаем высший приоритет окна

	MSG msg;
	ZeroMemory(&msg,sizeof(msg));

	while(g_bApplicationState)
	{
		if(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return 0;											//Завершаем работу приложения
}

long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
	switch(iMsg)
	{
		case WM_DESTROY:
		{
			g_bApplicationState = false;
			return 0;
		}
	}

	return DefWindowProc(hWnd,iMsg,wParam,lParam);
}