📄 cgame.cpp
字号:
#include "CGame.h"
int g_iRenderInWireFrame = 1;
ID3DXMesh* Teapot = 0;
CGame::CGame():
m_pD3D(NULL),
m_pDevice(NULL),
m_bDeviceLost(false),
m_pInformation(NULL),
m_pSkyBox(NULL),
m_pCamera(NULL),
TheCTerrain(NULL),
m_pMesh(NULL),
m_bSleep(false)
{
}
CGame::~CGame(void)
{
SAFE_DELETE(m_pMesh);
SAFE_DELETE(TheCTerrain);
SAFE_DELETE(m_pCamera);
SAFE_DELETE(m_pSkyBox);
SAFE_DELETE(m_pInformation);
SAFE_RELEASE(m_pDevice);
SAFE_RELEASE(m_pD3D);
}
void CGame::setmatWorld()
{
D3DXMATRIX matWorld, matView,matProj;//创建矩阵
D3DXVECTOR3 eye( 0, 3, -10 );//向量x = 0, y = 0, z = -10 视口的位置
D3DXVECTOR3 look( 0, 0, 0 );//向量x = 0, y = 0, z = 0 (原点)视口朝向的位置
D3DXVECTOR3 up( 0, 1, 0 );//向量x = 0, y = 1, z = 0 视口的正方向
D3DXMatrixLookAtLH( &matView, &eye, &look, &up );//定义视图转换矩阵
m_pDevice->SetTransform( D3DTS_VIEW, &matView );//视图变换
//透视投影变换
D3DXMatrixPerspectiveFovLH(
&matProj,
D3DXToRadian( 45.0f ),
800.0f / 600.0f,
1.0f,
1000.0f );//定义透视变换矩阵(45度夹角)
//////////////////////////////////////////////////////////////////////////
m_pDevice->SetTransform( D3DTS_PROJECTION, &matProj );//透视投影变换 //
/////////////////////////////////////////////////////////////////////////////
D3DXMatrixIdentity(&matWorld); ///单位划世界矩阵
/////////////////////////////////////////////////////////////////
D3DXMatrixTranslation( &matWorld, 0, 0, 1); //设置世界转换坐标点
/////////////////////////////////////////////////////////////////
m_pDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); /////设置灯光关闭
// m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME ); // //设置以线形绘制(默认以面绘制)
m_pDevice->SetTransform(D3DTS_WORLD,&matWorld);//设置世界转换
}
bool CGame::Init(HINSTANCE hInstance, HWND hWnd)
{
//COM初始化
CoInitialize(NULL);
//如果初始化D3D返回FALSE;
if (FAILED(InitD3D(hWnd)))
{
return false;
}
setmatWorld();
//////////////设置字体,newFPS对象/////////////////////////////////////
m_pInformation = new CInformation(m_pDevice,hWnd);
return true;
}
HRESULT CGame::InitD3D(HWND hWnd)
{
//创建Direct3D的COM的接口对象
if (NULL==(m_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
{
::MessageBox(0, "错误:创建D3D的COM接口 - 失败", 0, 0);
return E_FAIL;
}
//////////获取硬件显示模式
D3DDISPLAYMODE d3ddm;
if (FAILED(m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
::MessageBox(0, "错误:获取硬件显示模式 - 失败", 0, 0);
return E_FAIL;
}
//////////////////////
RECT rect;
GetClientRect(hWnd,&rect);
///////////////////////
ZeroMemory(&m_d3dpp,sizeof(m_d3dpp));
m_d3dpp.Windowed=TRUE;//FALSE
m_d3dpp.BackBufferCount=1;
m_d3dpp.BackBufferFormat=d3ddm.Format;
m_d3dpp.BackBufferWidth=rect.right-rect.left;
m_d3dpp.BackBufferHeight=rect.bottom-rect.top;
m_d3dpp.hDeviceWindow=hWnd;
m_d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
m_d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
m_d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
m_d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
m_d3dpp.EnableAutoDepthStencil=TRUE;
/////////////创建D3D设备/////
if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&m_d3dpp,&m_pDevice)))
{
::MessageBox(0, "错误:创建D3D设备 - 失败", 0, 0);
return E_FAIL;
}
//////////初始化及加载天空盒///////////////////////////////
m_pSkyBox = new CSkyBox;
m_pSkyBox->Init( ".\\sky\\cloudy_", m_pDevice );;
m_pCamera = new CCamera;
m_pCamera->setPosition(&D3DXVECTOR3(1.0f, 1.0f, 1.0f));
m_pMesh = new CSkinMesh( m_pDevice );
m_pMesh->LoadFromXFile( ".\\Hero.X" );
/////////初始化地形///////////////////////////////
TheCTerrain = new CTerrain();
TheCTerrain->Init( m_pDevice,100.f,100.f,64,64,20.f ,"terrain_heightmap.png",4,
"terrain_texture.dds", "terrain_detail.dds", 2);
//TheCTerrain->Init(m_pDevice,100.f,10.f ,"terrain_heightmap.png",4,
// "terrain_texture.dds", "terrain_detail.dds", 2);
/*TheCTerrain->Init( m_pDevice,50.f,100.f,100,100,1 ,
"terrain_texture.dds", "terrain_detail.dds", 2);*/
//TheCTerrain->InitHeightMap(m_pDevice,100.f,100.f,64,64,50.f ,"coastMountain64.raw",
// "terrain_texture.dds", "terrain_detail.dds", 2);
return S_OK;
}
void CGame::Update(float fElapsedTime)
{
if(!m_bSleep)//控制了窗口不在激活状态时,不捕获按键信息
{
m_pCamera->ProcesKey(m_pDevice,fElapsedTime);
m_pCamera->Update( m_pDevice, fElapsedTime );
D3DXVECTOR3 _pos1;
m_pCamera->getPosition(&_pos1);
_pos1.y = TheCTerrain->getHeight(_pos1.x,_pos1.z)+2;
m_pCamera->setPosition(&_pos1);
}
}
int id = 1;
void CGame::Render(float fElapsedTime)
{
//在每次渲染前判断是否发生设备丢失
HRESULT hr;
//后备缓冲区须于窗口大小一致才能正确获取D3DERR_DEVICENOTRESET
//否则检测系统协调层级只能获得D3DERR_DEVICELOST
if (true==m_bDeviceLost)
{
Sleep(100);//100 mill时间
//检查系统协调层级,系统可以证据函数返回值判断设备丢失时采用的措施
if (FAILED(hr=m_pDevice->TestCooperativeLevel()))
{
if (hr==D3DERR_DEVICELOST)
{
return;
}
//设备丢失能够被自动重置,这时候返回进行再次尝试
if (hr==D3DERR_DEVICENOTRESET)
{
//调用Reset函数重置设备
hr=m_pDevice->Reset(&m_d3dpp);
if (FAILED(hr))
{
return;
}
return;
}
}
m_bDeviceLost=false;
}
//static float timeStart = timeGetTime()/1000.0f;
//static float timeNow = timeGetTime()/1000.0f;
//float tFrameTime = timeNow;
//timeNow = timeGetTime()/1000.0f;
//tFrameTime = timeNow - tFrameTime;
m_pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,0),1.0F,0);
m_pDevice->BeginScene();
m_pMesh->Render( fElapsedTime, D3DXVECTOR3(-100,0,250),3.14 );
/////////////////////渲染天空盒/////////////////////////////////////////////
D3DXMATRIX matWorld;
D3DXMatrixTranslation( &matWorld,0.0f,0.0f,0.0f );
m_pSkyBox->Render( matWorld );
/////////////////////渲染地面/////////////////////////////////////////////
D3DXMatrixTranslation( &matWorld,-100.0f,-20.0f,-20.0f );
TheCTerrain->Render(matWorld);
///////////在屏幕上输出FPS和鼠标POS信息/////////////////////////
m_pInformation->drawFPS(fElapsedTime);
m_pInformation->drawCursorPos();
D3DXVECTOR3 pos;
m_pCamera->getPosition(&pos);
m_pInformation->drawCameraPos(pos);
m_pDevice->EndScene();
hr=m_pDevice->Present(NULL,NULL,NULL,NULL);
if (hr==D3DERR_DEVICELOST)
{
::MessageBox(0, "错误:设备丢失", 0, 0);
m_bDeviceLost=true;
}
}
void CGame::HandleMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if(m_pCamera)
m_pCamera->HandleMessage(hWnd, message, wParam, lParam);
switch(wParam)
{
case VK_F2:
g_iRenderInWireFrame++;
switch(g_iRenderInWireFrame)
{
case 1:
m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
break;
case 2:
m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_POINT );
break;
case 3:
m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
break;
case 4:
m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
g_iRenderInWireFrame = 1;
break;
}
/* g_bRenderInWireFrame = !g_bRenderInWireFrame;
if( g_bRenderInWireFrame == true )
g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
else
g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );*/
break;
case WM_KEYDOWN :
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -