www.pudn.com > terrainSimple.rar > basic.cpp


/******************************************************************** 
	filename: 	basic.cpp	 
	file base:	basic 
	file ext:	cpp 
	author:		哈尔滨顺时针电脑学校 
	 
	purpose:	8-13封装一个摄像机类
*********************************************************************/ 
/************************************************************************ 
 注意: 
1、在“工程属性”--“链接器”--“输入”--“附加依赖项”中加入: 
d3dx9dt.lib d3d9.lib d3dxof.lib comctl32.lib winmm.lib dxguid.lib 
2、在“工程属性”--“C/C++”--“常规”--“附加包含目录”中加入: 
"SSZGameX;Common\Include" 
************************************************************************/ 
#define STRICT 
#include  
#include  
#include  
#include  
#include  
#include "DXUtil.h" 
#include "D3DEnumeration.h" 
#include "D3DSettings.h" 
#include "D3DApp.h" 
#include "D3DFile.h" 
#include "D3DFont.h" 
#include "D3DUtil.h" 
#include "resource.h" 
#include  
#include  
#include "SSZd3d.h" 
#include "camera.h" 
#include "terrain.h" 
 
 
//----------------------------------------------------------------------------- 
// Name: class CMyD3DApplication 
// Desc: 应用程序类。 它的基类(CD3DApplication)提供了在所有 Direct3D 程序中的一 
//       些通用功能。 CMyD3DApplication 加入一些用于本程序的特殊功能。 
//----------------------------------------------------------------------------- 
class CMyD3DApplication : public CD3DApplication 
{	 
 
	CD3DFont*    m_pFont; 	 
 
	//Camera TheCamera(Camera::LANDOBJECT); 
	Camera       m_TheCamera; 
	Terrain*     m_TheTerrain; 
 
protected: 
    HRESULT OneTimeSceneInit(); 
    HRESULT InitDeviceObjects(); 
    HRESULT RestoreDeviceObjects(); 
    HRESULT InvalidateDeviceObjects(); 
    HRESULT DeleteDeviceObjects(); 
    HRESULT FinalCleanup(); 
	HRESULT Render(); 
	HRESULT FrameMove(); 
	HRESULT ConfirmDevice( D3DCAPS9* pCaps, DWORD dwBehavior,  
		D3DFORMAT adapterFormat, D3DFORMAT backBufferFormat ); 
     
public: 
    CMyD3DApplication(); 
}; 
 
 
 
 
//----------------------------------------------------------------------------- 
// Name: WinMain() 
// Desc: 程序入口点,初始化所有东西后,进入消息循环,空闲时间渲染场景。 
//----------------------------------------------------------------------------- 
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) 
{ 
    CMyD3DApplication d3dApp; 
 
    InitCommonControls(); 
    if( FAILED( d3dApp.Create( hInst ) ) ) 
        return 0; 
 
    return d3dApp.Run(); 
} 
 
//----------------------------------------------------------------------------- 
// Name: CMyD3DApplication() 
// Desc: 构造函数,设置应用程序的一些属性 
//----------------------------------------------------------------------------- 
CMyD3DApplication::CMyD3DApplication() 
:m_TheCamera(Camera::LANDOBJECT)//地面物体 
{ 
    m_strWindowTitle  = _T("哈尔滨顺时针电脑学校 电话:0451-86220686"); 
    m_d3dEnumeration.AppUsesDepthBuffer = TRUE;	 
    m_dwCreationWidth		= 800;   // Width used to create window 
    m_dwCreationHeight		= 600;	 
	m_pFont = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD ); 
	m_TheTerrain = NULL; 
	 
} 
 
 
//----------------------------------------------------------------------------- 
// Name: ConfirmDevice() 
// Desc: 在设备初始化期间调用,此代码检查设备的最低能力 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS9* pCaps, DWORD dwBehavior, 
                                          D3DFORMAT adapterFormat, D3DFORMAT backBufferFormat ) 
{ 
    return S_OK; 
} 
 
 
//----------------------------------------------------------------------------- 
// Name: OneTimeSceneInit() 
// Desc: 在最初的应用程序启动期间调用,此函数执行所有要求永久初始化的工作。 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::OneTimeSceneInit() 
{ 
	 
    return S_OK; 
} 
 
 
//----------------------------------------------------------------------------- 
// Name: InitDeviceObjects() 
// Desc: 初始化场景对象 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::InitDeviceObjects() 
{ 
	m_pFont->InitDeviceObjects( m_pd3dDevice ); 
    return S_OK; 
} 
 
//----------------------------------------------------------------------------- 
// Name: RestoreDeviceObjects() 
// Desc: 恢复场景对象 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::RestoreDeviceObjects() 
{ 
    m_pFont->RestoreDeviceObjects(); 
	 
	// 
	// 创建地形 
	// 
 
	D3DXVECTOR3 lightDirection(0.0f, 1.0f, 0.0f); 
	m_TheTerrain = new Terrain(m_pd3dDevice, "coastMountain64.raw", 64, 64, 10, 0.5f); 
	m_TheTerrain->genTexture(&lightDirection); 
 
	// 
	// Set projection matrix. 
	// 
 
	D3DXMATRIX proj; 
	D3DXMatrixPerspectiveFovLH( 
		&proj, 
		D3DX_PI * 0.25f, // 45 - degree 
		(float)800.0f / (float)600.0f, 
		1.0f, 
		1000.0f); 
	m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj); 
 
 
	// 
	// Set texture filters. 
	// 
	//三线性过滤 
	m_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); 
	m_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); 
	m_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 
 
	return S_OK; 
} 
 
//----------------------------------------------------------------------------- 
// Name: InvalidateDeviceObjects() 
// Desc: 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::InvalidateDeviceObjects() 
{ 
	m_pFont->InvalidateDeviceObjects(); 
     
    return S_OK; 
} 
 
//----------------------------------------------------------------------------- 
// Name: DeleteDeviceObjects() 
// Desc: 在程序退出时或设备改变时调用,这个函数删除每一个依赖设备的对象。 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::DeleteDeviceObjects() 
{ 
	m_pFont->DeleteDeviceObjects();	 
	SAFE_DELETE(m_TheTerrain); 
    return S_OK; 
} 
 
//----------------------------------------------------------------------------- 
// Name: FrameMove() 
// Desc: 场景改变的入口点,每一帧调用一次。 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::FrameMove() 
{ 
	// 
	// Update: Update the camera. 
	// 
	float timeDelta=0.01f; 
 
	// forward/backward 
	if( ::GetAsyncKeyState('W') & 0x8000f ) 
		m_TheCamera.walk(4.0f * timeDelta); 
 
	if( ::GetAsyncKeyState('S') & 0x8000f ) 
		m_TheCamera.walk(-4.0f * timeDelta); 
 
	// left/right 
	if( ::GetAsyncKeyState('A') & 0x8000f ) 
		m_TheCamera.strafe(-4.0f * timeDelta); 
 
	if( ::GetAsyncKeyState('D') & 0x8000f ) 
		m_TheCamera.strafe(4.0f * timeDelta); 
 
	// up/down 
	if( ::GetAsyncKeyState('R') & 0x8000f ) 
		m_TheCamera.fly(4.0f * timeDelta); 
 
	if( ::GetAsyncKeyState('F') & 0x8000f ) 
		m_TheCamera.fly(-4.0f * timeDelta); 
 
	if( ::GetAsyncKeyState(VK_UP) & 0x8000f ) 
		m_TheCamera.pitch(1.0f * timeDelta); 
 
	if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f ) 
		m_TheCamera.pitch(-1.0f * timeDelta); 
 
	if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f ) 
		m_TheCamera.yaw(-1.0f * timeDelta); 
 
	if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f ) 
		m_TheCamera.yaw(1.0f * timeDelta); 
 
	if( ::GetAsyncKeyState('N') & 0x8000f ) 
		m_TheCamera.roll(1.0f * timeDelta); 
 
	if( ::GetAsyncKeyState('M') & 0x8000f ) 
		m_TheCamera.roll(-1.0f * timeDelta); 
 
	D3DXVECTOR3 pos; 
	m_TheCamera.getPosition(&pos); 
	float height = m_TheTerrain->getHeight( pos.x, pos.z ); 
	pos.y = height + 5.0f; // add height because we're standing up 
	m_TheCamera.setPosition(&pos); 
 
	// Update the view matrix representing the cameras  
	// new position/orientation. 
	D3DXMATRIX V; 
	m_TheCamera.getViewMatrix(&V); 
	m_pd3dDevice->SetTransform(D3DTS_VIEW, &V); 
 
	 
	 
    return S_OK; 
} 
 
//----------------------------------------------------------------------------- 
// Name: Render() 
//Desc:3D渲染的入口点,每帧调用一次。该函数设置渲染状态,清除视口,渲染场景 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::Render() 
{ 
	m_pd3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); 
  
	// Begin the scene 
	if( SUCCEEDED( m_pd3dDevice->BeginScene() ) ) 
	{	 
		D3DXMATRIX I; 
		D3DXMatrixIdentity(&I); 
 
		if( m_TheTerrain ) 
			m_TheTerrain->draw(&I, false);	 
		// Output statistics 
		m_pFont->DrawText( 2,  0, D3DCOLOR_ARGB(255,255,255,0), m_strFrameStats ); 
		m_pFont->DrawText( 2, 20, D3DCOLOR_ARGB(255,255,255,0), m_strDeviceStats ); 
		// End the scene. 
		m_pd3dDevice->EndScene(); 
	} 
    return S_OK; 
} 
 
//----------------------------------------------------------------------------- 
// Name: FinalCleanup() 
// Desc: 应用程序退出前调用,本函数给了应用程序一个在自己退出前做清理工作的机会 
//----------------------------------------------------------------------------- 
HRESULT CMyD3DApplication::FinalCleanup() 
{ 
	SAFE_DELETE(m_pFont); 
    return S_OK; 
}