⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameapp.cpp

📁 使用DirectX9 写的通用3D游戏框架
💻 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 + -