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

📄 main.cpp

📁 极限赛车CarGameDemo DirectX9
💻 CPP
字号:
#include "StdAfx.h"
#include "../common/myd3d.h"
#include "game.h"
//-----------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------
const int SCREEN_Width  = 640;
const int SCREEN_Height = 480;
TCHAR winClassName[] = TEXT("MyGame");					// WNCLASS名
TCHAR winTitleName[] = TEXT("赛车游戏DEMO");            // 窗口标题名


HWND g_hwnd=0;
IDirect3DDevice9* g_device = 0; 
BOOL		g_bActive = FALSE;
//创建Game对象cGame
Game cGame;
//----------------------------------------------------------------------
//前向声明
//----------------------------------------------------------------------
bool WinInit( HINSTANCE hInst, int nCmdShow, HWND *phWnd);
bool InitD3D(HWND hwnd,D3DDEVTYPE deviceType, IDirect3DDevice9** ppdevice);
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
//----------------------------------------------------------------------
//入口函数
//----------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hinstance,
				   HINSTANCE prevInstance, 
				   PSTR cmdLine,
				   int showCmd)
{
	//初始化窗口
	if(!WinInit( hinstance, showCmd, &g_hwnd) )
	{
		::MessageBox(g_hwnd, TEXT("WinInit() - FAILED"), 0, 0);
		return 0;
	}
	
	//初试化D3D
	if( !InitD3D(g_hwnd, D3DDEVTYPE_HAL , &g_device))
	{
		::MessageBox(g_hwnd, TEXT("InitD3D() - FAILED"), 0, 0);
		return 0;
	}

	//初始化游戏
	if( !cGame.GameInit() )
	{
		::MessageBox(g_hwnd, TEXT("GameInit() - FAILED"), 0, 0);
		return 0;
	}
	//进入游戏循环
	cGame.EnterMsgLoop();
	//关闭游戏
	cGame.GameShutDown();
	//释放设备
	g_device->Release();	

	return 0;
}

bool WinInit( HINSTANCE hInstance, int nCmdShow, HWND *phWnd)
{
	//定义一个窗口类并填充
	WNDCLASS wc;

	wc.style         = CS_HREDRAW | CS_VREDRAW;						//窗口类样式
	wc.lpfnWndProc   = WndProc;										//窗口回调函数
	wc.cbClsExtra    = 0;											//类的额外内存
	wc.cbWndExtra    = 0;											//窗口的额外内存
	wc.hInstance     = hInstance;									//窗口实例句柄
	wc.hIcon         = LoadIcon(0, IDI_APPLICATION);				//图标句柄
	wc.hCursor       = LoadCursor(0, IDC_ARROW);					//光标句柄
	wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);		//画刷句柄
	wc.lpszMenuName  = 0;											//菜单名
	wc.lpszClassName = winClassName;								//窗口类名

	//注册窗口	
	if( !RegisterClass(&wc) ) 
	{
		::MessageBox(0, TEXT("RegisterClass() - FAILED"), 0, 0);
		return false;
	}
	
	//创建窗口	
	HWND hwnd = 0;
	hwnd = ::CreateWindow( winClassName, winTitleName,
		/*WS_EX_TOPMOST*/WS_POPUP,			//窗口类型
		100, 60,							//窗口位置
		SCREEN_Width, SCREEN_Height,		//窗口宽高
		0 ,									//父窗口句柄
		0 ,									//菜单句柄
		hInstance,							//实例句柄
		0);									//附加参数

	if( !hwnd )
	{
		::MessageBox(0, TEXT("CreateWindow() - FAILED"), 0, 0);
		return false;
	}

	::ShowWindow(hwnd, nCmdShow/*SW_SHOW*/);
	::UpdateWindow(hwnd);
	//保存窗口的句柄
	*phWnd   = hwnd;
	return true;
}


//-----------------------------------------------------------------------------
// 名称:InitD3D()
// 功能:初始化D3D
//-----------------------------------------------------------------------------
bool InitD3D(HWND hwnd,D3DDEVTYPE deviceType, IDirect3DDevice9** ppdevice)
{
	HRESULT hr = 0;

	// 1.获得一个IDirect3D9接口指针.
	IDirect3D9* d3d9 = 0;
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

    if( !d3d9 )
	{
		::MessageBox(0, TEXT("Direct3DCreate9() - FAILED"), 0, 0);
		return false;
	}

	// 2.检查设备能力
	D3DCAPS9 caps;
	d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

	int vp = 0;
	if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
	{
		vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
		::MessageBox(hwnd, TEXT("支持硬件顶点处理"), 0, 0);
	}
	else
	{
		vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
		/*::MessageBox(hwnd, TEXT("不支持硬件顶点处理"), 0, 0);*/
	}

	// 3.填充 D3DPRESENT_PARAMETERS 结构.
	D3DPRESENT_PARAMETERS d3dpp;
	d3dpp.BackBufferWidth            = SCREEN_Width;					//后备缓冲宽度
	d3dpp.BackBufferHeight           = SCREEN_Height;					//后备缓冲高度
	d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;					//后备缓冲格式
	d3dpp.BackBufferCount            = 1;								//后备缓冲数
	d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;				//抗锯齿类型
	d3dpp.MultiSampleQuality         = 0;								//抗锯齿等级
	d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;			//表面交换方式
	d3dpp.hDeviceWindow              = g_hwnd;							//关联窗口句柄
	d3dpp.Windowed                   = true;							//是否窗口模式显示
	d3dpp.EnableAutoDepthStencil     = true;							//是否自动创建深度/模板缓冲 
	d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;					//深度/模板缓冲格式
	d3dpp.Flags                      = 0;								//附加标志
	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;			//刷新率
	d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;	//交换方式

	// 4.创建设备
	hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, deviceType, hwnd, 
		vp, &d3dpp, ppdevice);            
    if( FAILED(hr) )
	{
		// 尝试使用16位深度缓冲格式
		d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

		hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, deviceType, hwnd, 
			vp, &d3dpp, ppdevice);

		if( FAILED(hr) )
		{
			d3d9->Release(); 
			::MessageBox(0, TEXT("CreateDevice() - FAILED"), 0, 0);
			return false;
		}
	}
	d3d9->Release(); 
	return true;
}

//-----------------------------------------------------------------------------
// 名称:WndProc()
// 功能:处理消息
//-----------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	switch( msg )
	{
	case WM_ACTIVATEAPP:
        g_bActive = (BOOL)wParam;
            break;
	case WM_DESTROY:
		::PostQuitMessage(0);
		break;
		
	case WM_KEYDOWN:
		if( wParam == VK_ESCAPE )
			::DestroyWindow(hwnd);
		if( KEYDOWN(VK_LSHIFT))//shift键切换视野
			cGame._topView = !cGame._topView;
		if( KEYDOWN(VK_LCONTROL) )
		{
			cGame._freeView = !cGame._freeView;
			cGame._gameViewType = cGame.FREE;
		}
		if( cGame._gameState==Game::GameState_Over )
		{
			if( KEYDOWN('Y') )
				cGame._gameState = Game::GameState_ReBegin;
			if( KEYDOWN('N') )
				cGame._gameState = Game::GameState_Finish;
		}
		break;
	}
	return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -