Code:
/*
Beginning Game Programming
Chapter 5
D3D_Game_Template
*/
//header files to include
#include <d3d9.h>
#include <time.h>
//application title
#define APPTITLE (LPCSTR)"Direct3D_Windowed"
//forward declarations
LRESULT WINAPI WinProc(HWND,UINT,WPARAM,LPARAM);
ATOM MyRegisterClass(HINSTANCE);
BOOL InitInstance(HINSTANCE, int, HWND*);
int Game_Init(HWND);
void Game_Run(HWND);
void Game_End(HWND);
//Direct3D objects
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;
//entry point for a Windows program
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// declare variables & register the class & initialize application & creates new window
MSG msg;
MyRegisterClass(hInstance);
HWND hWnd;
if(!InitInstance(hInstance, nCmdShow, &hWnd))return FALSE;
//initialize the game
if (!Game_Init(hWnd))return 0;
// main message loop
int done = 0;
while (!done)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
MessageBox(hWnd, (LPCSTR)"Received WM_QUIT message", (LPCSTR)"WinMain", MB_OK);
done = 1;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
Game_Run(hWnd);
}
return msg.wParam;
}
///////////////////////////////////////////////////////////////////////////////
// WinProc & WinMain helper function///////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
LRESULT WINAPI WinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Game_End(hwnd);
PostQuitMessage(0);
return 0;
}
return DefWindowProc( hwnd, msg, wParam, lParam );
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
//create the window class structure
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
//fill the struct with info
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = APPTITLE;
wc.hIconSm = NULL;
return RegisterClassEx(&wc);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow, HWND *hwnd)
{
//create new window
*hwnd = CreateWindow(
APPTITLE, //window class
APPTITLE, //title bar
WS_OVERLAPPEDWINDOW, //window style
CW_USEDEFAULT, //x position of window
CW_USEDEFAULT, //y position of window
500, //width of window
400, //height of window
NULL, //parent window
NULL, //menu
hInstance, //application interface
NULL); //window parameters
//was there an error creating the window
if(!*hwnd)return FALSE;
//display the window
ShowWindow(*hwnd, nCmdShow);
UpdateWindow(*hwnd);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//GAME FUNCTIONS/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
int Game_Init(HWND hwnd)
{
//display init message
MessageBox(hwnd, (LPCSTR)"Program is about to start", (LPCSTR)"Game_Init", MB_OK);
//initialize Direct3D
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (d3d == NULL)
{
MessageBox(hwnd, (LPCSTR)"Error initializing Direct3D", (LPCSTR)"Error", MB_OK);
return 0;
}
//set Direct3D presentation parameters
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
//create Direct3D device
d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);
if (d3ddev == NULL)
{
MessageBox(hwnd, (LPCSTR)"Error creating Direct3D device", (LPCSTR)"Error", MB_OK);
return 0;
}
//set random number seed
srand((unsigned int)time(NULL));
//return okay
return 1;
}
void Game_Run(HWND hwnd)
{
//make sure the Direct3D device is valid
if (d3ddev == NULL)return;
//clear the backbuffer to black
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,255), 1.0f, 0);
//start rendering
if (d3ddev->BeginScene())
{
//stop rendering
d3ddev->EndScene();
}
//display the back buffer on the screen
d3ddev->Present(NULL, NULL, NULL, NULL);
}
void Game_End(HWND hwnd)
{
//display close message
MessageBox(hwnd, (LPCSTR)"Program is about to end", (LPCSTR)"Game_End", MB_OK);
//release the Direct3D device
if (d3ddev != NULL)
d3ddev->Release();
//release the Direct3D object
if (d3d != NULL)
d3d->Release();
}