📄 gameapp.cpp
字号:
#include "GameApp.h"
#include "resource.h"
//====================================================================
//全局游戏
CGameApp *g_pGame = NULL;
//====================================================================
//窗口过程函数
LRESULT CALLBACK
MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if( g_pGame != NULL )
return g_pGame->MsgProc(msg, wParam, lParam);
else
return DefWindowProc(hwnd, msg, wParam, lParam);
}
CGameApp::CGameApp(HINSTANCE hInstance, std::string winCaption, D3DDEVTYPE devType, DWORD vertexProcessType)
:VertexProcessType(VertexProcessType)
{
MainWndCaption = winCaption;
DevType = devType;
VertexProcessType = vertexProcessType;
GameState = GAMEMENU;
g_hAppInst = hInstance;
g_hMainWnd = NULL;
g_pd3dObject = NULL;
g_pd3dDevice = NULL;
g_dwScreenWidth = 0;
g_dwScreenHeight = 0;
InitMainWindow();
InitDirect3D();
}
CGameApp::~CGameApp()
{
CleanUp();
}
HINSTANCE CGameApp::GetAppInst()
{
return g_hAppInst;
}
HWND CGameApp::GetMainWnd()
{
return g_hMainWnd;
}
void CGameApp::InitMainWindow()
{
//填写窗口类属性
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = MainWndProc; //窗口过程函数
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = g_hAppInst; //应用程序实例
wc.hIcon = LoadIcon(0, "IDI_TANK");
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = "GameApp";
//注册窗口类
if( !RegisterClass(&wc) )
{
MessageBox(0, "RegisterClass FAILED", 0, 0);
PostQuitMessage(0);
}
//创建窗口
g_hMainWnd = CreateWindow( "GameApp",
MainWndCaption.c_str(), //窗口标题
//WS_OVERLAPPEDWINDOW, //窗口样式
WS_POPUP,
100,
100,
800, //窗口宽度
600, //窗口高度
NULL,
NULL,
g_hAppInst, //实例句柄
NULL);
if(!g_hMainWnd)
{
MessageBox(0, "CreateWindow FAILED", 0, 0);
PostQuitMessage(0);
}
}
void CGameApp::InitDirect3D()
{
//创建Direct3D对象
g_pd3dObject = Direct3DCreate9(D3D_SDK_VERSION);
if(!g_pd3dObject)
{
MessageBox(0, "Direct3DCreate9 FAILED", 0, 0);
PostQuitMessage(0);
}
//获取显示模式
D3DDISPLAYMODE mode;
g_pd3dObject->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);
g_dwScreenWidth = mode.Width;
g_dwScreenHeight = mode.Height;
//检查显卡性能
D3DCAPS9 caps;
g_pd3dObject->GetDeviceCaps(D3DADAPTER_DEFAULT, DevType, &caps);
if(VertexProcessType == D3DCREATE_HARDWARE_VERTEXPROCESSING &&
!(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT))
{
MessageBox(0, "D3DCREATE_HARDWARE_VERTEXPROCESSING FAILED", 0, 0);
PostQuitMessage(0);
}
//填写D3DPRESENT_PARAMETERS结构
D3DPRESENT_PARAMETERS d3dPP;
ZeroMemory(&d3dPP, sizeof(d3dPP));
d3dPP.BackBufferWidth = 800;
d3dPP.BackBufferHeight = 600;
//d3dPP.BackBufferWidth = mode.Width;
//d3dPP.BackBufferHeight = mode.Height;
d3dPP.BackBufferFormat = mode.Format;
d3dPP.BackBufferCount = 1;
d3dPP.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dPP.MultiSampleQuality = 0;
d3dPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dPP.hDeviceWindow = g_hMainWnd;
d3dPP.Windowed = FALSE;
d3dPP.EnableAutoDepthStencil = TRUE;
d3dPP.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dPP.Flags = 0;
d3dPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
//创建设备
g_pd3dObject->CreateDevice(
D3DADAPTER_DEFAULT, //显示设备
DevType, //设备类型
g_hMainWnd, //窗口句柄
VertexProcessType, //顶点处理方式
&d3dPP, //D3DPRESENT_PARAMETERS对象
&g_pd3dDevice); //D3D设备对象
if(!g_pd3dDevice)
{
MessageBox(0, "CreateDevice FAILED", 0, 0);
PostQuitMessage(0);
}
}
void CGameApp::Run()
{
InitMenu();
//显示更新窗口
ShowWindow(g_hMainWnd, SW_SHOW);
UpdateWindow(g_hMainWnd);
MSG msg;
msg.message = WM_NULL;
while(msg.message != WM_QUIT)
{
if(PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
PlayGame();
}
}
}
LRESULT CGameApp::MsgProc(UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(g_hMainWnd, msg, wParam, lParam);
}
void CGameApp::PlayGame()
{
switch(GameState)
{
case GAMEMENU:
UpdateMenu();
BeginRender();
RenderMenu();
EndRender();
break;
case GAMEPLAY:
UpdateMenu();
UpdateScene();
BeginRender();
RenderScene();
RenderMenu();
EndRender();
break;
}
}
void CGameApp::BeginRender()
{
g_pd3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
g_pd3dDevice->BeginScene();
}
void CGameApp::EndRender()
{
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -