Программируем игры на 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; |
bool g_bFullScreen = false; //Режим окна (true - полноэкранный/false - оконный) |
||
//Прототипы функций |
//Прототипы функций |
||
Строка 29: | Строка 29: | ||
{ |
{ |
||
WNDCLASSEX wc; |
WNDCLASSEX wc; |
||
wc.cbSize |
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 |
wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION); //Загружаем стандартную иконку |
||
if(!RegisterClassEx(&wc)) |
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);
}