基于框架(四)的一个例子,代码清单:
- //
- //
- // File: terrainDriver.cpp
- //
- // by tianzhihen
- //
- // 2008.10.27, MSVC++ 8.0
- //
- //
- #include "d3dUtility.h"
- #include "terrain.h"
- #include "camera.h"
- #include "fps.h"
- //
- // Globals
- //
- IDirect3DDevice9* Device = 0;
- const int Width = 640;
- const int Height = 480;
- Terrain* TheTerrain = 0;
- Camera TheCamera(Camera::LANDOBJECT);
- FPSCounter* FPS = 0;
- //
- // Framework Functions
- //
- bool Setup()
- {
- //
- // 创建地形.
- //
- D3DXVECTOR3 lightDirection(0.0f, 1.0f, 0.0f);
- TheTerrain = new Terrain(Device, "coastMountain64.raw", 64, 64, 10, 0.5f);
- TheTerrain->genTexture(&lightDirection);
- //
- // 创建字体.
- //
- FPS = new FPSCounter(Device);
- //
- // 纹理过滤.
- //
- Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- //
- // 设置 projection matrix.
- //
- D3DXMATRIX proj;
- D3DXMatrixPerspectiveFovLH(
- &proj,
- D3DX_PI * 0.25f, // 45 - degree
- (float)Width / (float)Height,
- 1.0f,
- 1000.0f);
- Device->SetTransform(D3DTS_PROJECTION, &proj);
- return true;
- }
- void Cleanup()
- {
- d3d::Delete<Terrain*>(TheTerrain);
- d3d::Delete<FPSCounter*>(FPS);
- }
- bool Display(float timeDelta)
- {
- //
- // Update the scene:
- //
- if( Device )
- {
- if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
- TheCamera.walk(100.0f * timeDelta);
- if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
- TheCamera.walk(-100.0f * timeDelta);
- if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
- TheCamera.yaw(-1.0f * timeDelta);
- if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
- TheCamera.yaw(1.0f * timeDelta);
- if( ::GetAsyncKeyState('N') & 0x8000f )
- TheCamera.strafe(-100.0f * timeDelta);
- if( ::GetAsyncKeyState('M') & 0x8000f )
- TheCamera.strafe(100.0f * timeDelta);
- if( ::GetAsyncKeyState('W') & 0x8000f )
- TheCamera.pitch(1.0f * timeDelta);
- if( ::GetAsyncKeyState('S') & 0x8000f )
- TheCamera.pitch(-1.0f * timeDelta);
- D3DXVECTOR3 pos;
- TheCamera.getPosition(&pos);
- float height = TheTerrain->getHeight( pos.x, pos.z );
- pos.y = height + 5.0f; // add height because we're standing up
- TheCamera.setPosition(&pos);
- D3DXMATRIX V;
- TheCamera.getViewMatrix(&V);
- Device->SetTransform(D3DTS_VIEW, &V);
- //
- // Draw the scene:
- //
- Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff000000, 1.0f, 0);
- Device->BeginScene();
- D3DXMATRIX I;
- D3DXMatrixIdentity(&I);
- if( TheTerrain )
- TheTerrain->draw(&I, false);
- if( FPS )
- FPS->render(0xffffffff, timeDelta);
- Device->EndScene();
- Device->Present(0, 0, 0, 0);
- }
- return true;
- }
- //
- // WndProc
- //
- LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch( msg )
- {
- case WM_DESTROY:
- ::PostQuitMessage(0);
- break;
- case WM_KEYDOWN:
- if( wParam == VK_ESCAPE )
- ::DestroyWindow(hwnd);
- break;
- }
- return ::DefWindowProc(hwnd, msg, wParam, lParam);
- }
- //
- // WinMain
- //
- int WINAPI WinMain(HINSTANCE hinstance,
- HINSTANCE prevInstance,
- PSTR cmdLine,
- int showCmd)
- {
- if(!d3d::InitD3D(hinstance,
- Width, Height, true, D3DDEVTYPE_HAL, &Device))
- {
- ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
- return 0;
- }
- if(!Setup())
- {
- ::MessageBox(0, "Setup() - FAILED", 0, 0);
- return 0;
- }
- d3d::EnterMsgLoop( Display );
- Cleanup();
- Device->Release();
- return 0;
- }
附图: