Программируем игры на 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);
}