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;
}