www.pudn.com > D3DITEM01.rar > D3DGame.cpp


#include "D3DGame.h" 
 
#pragma comment(lib, "d3dx9.lib") 
#pragma comment(lib, "Winmm.lib") 
 
CGame::CGame(IDirect3DDevice9* device):m_pDevice(device),m_pMesh(NULL) 
{ 
	m_pMesh=new CMesh();		//必要要构造一次mesh 
 
	m_pCamera=new CCamera();	//对摄象机的初始化构造函数 
 
} 
 
bool CGame::InitGame() 
{ 
	m_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);		//关闭灯光 
 
	//在以前的代码中是用的系统默认的摄象机(观察视角) 
	//初始化摄象机//////////////////////////////////////////////// 
	m_pCamera->InitCamera( 
		D3DXVECTOR3(0.0f, 5.0f, 5.0f),			//摄象机位置(点) 
		D3DXVECTOR3(0.0f, 0.0f, 0.0f),			//摄象机观察点(点) 
		D3DXVECTOR3(0.0f, 1.0f, 0.0f),			//摄象机正上方(方向) 
		D3DX_PI*0.5f,							//视角弧度 
		4.0f/3.0f,								//观察表面长宽比 
		1.f,									//近观察表面的距离 
		500.f,									//远观察表面的距离 
		0.01f,									//摄像机绕Y轴旋转的角位移速度 
		0.01f,									//摄像机绕X轴旋转的角位移速度 
		0.1f,									//摄像机的平移速度 
		D3DX_PI*0.5f,									//摄像机绕X轴旋转的俯仰角最大值 
		-D3DX_PI*0.5f									//摄像机绕X轴旋转的俯仰角最小值 
		); 
 
	m_pMesh->Init(m_pDevice,"church.X");			//加栽模型数据 
 
	return D3D_OK; 
} 
 
void CGame::UpDate(float timedate) 
{ 
	//摄象机的移动实现 
	m_pCamera->GetKeyboardInput(1.5f);		//里面的float可以控制游戏中行走的快慢程度 
	m_pCamera->Update(); 
 
	m_pCamera->SetMatrix(m_pDevice);		//随时更新摄象机的位置(呵呵) 
	/*在此添加其他代码*/ 
} 
 
bool g_bDeviceLost =false; 
 
void CGame::GameRender(float timeDelta) 
{ 
	if(!m_pDevice)			//获得当前设备的状态 
		return; 
 
	//每次进来都要检测设备是否丢失 
	if(g_bDeviceLost) 
	{ 
		Sleep(100); 
		HRESULT hr; 
 
		// 后备缓冲区须与窗口大小一致才能正确获得D3DERR_DEVICENOTRESET 
		// 否则检测系统协调层级只能获得D3DERR_DEVICELOST 
		if(FAILED(hr = m_pDevice->TestCooperativeLevel())) 
		{ 
			if(hr == D3DERR_DEVICELOST) 
				return; 
 
			// 设备丢失能够被自动重置,这时候返回进行再次尝试 
			if(hr == D3DERR_DEVICENOTRESET) 
			{ 
				//把显存里的数据全部撤消掉 
				InvalidateDeviceObjects(); 
 
				//设备恢复函数 
				hr = m_pDevice->Reset(&g_d3dpp); 
				if(FAILED(hr)) 
					return; 
 
				//重新设置显存里的数据 
				RestoreDeviceObjects(); 
				return; 
			} 
			 
		} 
		g_bDeviceLost = !g_bDeviceLost;		//设备已经找回 
	} 
 
	UpDate(timeDelta);		//各种变换的时时更新  
 
	//晴空设备缓冲 
	m_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); 
 
	m_pDevice->BeginScene();			//开始绘制图象 
 
	m_pMesh->Render(0);					//绘制游戏画面 
 
	m_pDevice->EndScene();				//绘制结束 
 
	if(m_pDevice->Present(0,0,0,0) == D3DERR_DEVICELOST)		//翻页 
		g_bDeviceLost=!g_bDeviceLost; 
 
	Sleep(10); 
} 
 
//画场景的函数/----------------------------------//////////////////////// 
bool CGame::DrawView() 
{ 
	return false; 
} 
 
HRESULT CGame::InvalidateDeviceObjects() 
{ 
	m_pMesh->~CMesh();		//清空内存中的数据 
	return S_OK; 
} 
HRESULT CGame::RestoreDeviceObjects() 
{ 
	InitGame();				//设备恢复函数调用 
	return S_OK; 
}