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