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

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


== Урок 1 - Создание окна. Инициализация Direct3D ==
== Урок 1 - Создание окна. Инициализация Direct3D ==
Создадим проект с именем Lesson1.
Создадим проект с именем Lesson1. Добавляем в проект файл main.cpp и начинаем его заполнять.
Для работы приложения нам требуеться библиотеки d3d9.lib, d3dx9.lib, winmm.lib. Подключим их.
<source lang="cpp">
<source lang="cpp">
//Подключаем библиотеки
//Подключаем библиотеки
Строка 9: Строка 10:
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"winmm.lib")
</source>

Также нам потребуетьс подключить заголовочные файлы, чтобы компилятор не выдавал ошибку. Подключаем.
<source lang="cpp">
//Подключаем закголовчные файлы
//Подключаем закголовчные файлы
#include <windows.h>
#include <windows.h>
#include <d3d9.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9.h>
</source>

Объявим глобальные переменные которые будут использованы в приложении
<source lang="cpp">
//Глобальные переменные
//Глобальные переменные
HWND g_hWnd = NULL; //Дескриптор окна
HWND g_hWnd = NULL; //Дескриптор окна
Строка 21: Строка 26:
bool g_bApplicationState = true; //Состояние приложения (true - работает/false - неработает)
bool g_bApplicationState = true; //Состояние приложения (true - работает/false - неработает)
bool g_bFullScreen = false; //Режим окна (true - полноэкранный/false - оконный)
bool g_bFullScreen = false; //Режим окна (true - полноэкранный/false - оконный)
</source>

Объявим прототипы функции которые будут использоваться в приложении
<source lang="cpp">
//Прототипы функций
//Прототипы функций
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow);
long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
long WINAPI WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
</source>

<source lang="cpp">
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
{

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

Введение

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

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

Создадим проект с именем Lesson1. Добавляем в проект файл main.cpp и начинаем его заполнять. Для работы приложения нам требуеться библиотеки d3d9.lib, d3dx9.lib, winmm.lib. Подключим их.

//Подключаем библиотеки
#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);
}