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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Строка 16: Строка 16:


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


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


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


Строка 51: Строка 51:
DWORD iWindowStyle = 0;
DWORD iWindowStyle = 0;


if(g_bFullScreen) //Если у нас поноэкранный режим
if(g_bFullScreen) //Если у нас поноэкранный режим
{
{
iWindowStyleEx = WS_EX_APPWINDOW;
iWindowStyleEx = WS_EX_APPWINDOW;
Строка 62: Строка 62:
}
}


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


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


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


MSG msg;
MSG msg;
Строка 99: Строка 99:
}
}


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



Версия от 18:49, 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);
}