📄 main.cpp
字号:
#include "Camera.h"
#include "Frustum.h"
#include "LODTerrain.h"
#include "..\..\GameEngine\GameEngine_Common.h"
#include "..\..\GameEngine\GameEngine_App\GameEngine_App.h"
#include "..\..\GameEngine\GameEngine_Input\GameEngine_Input.h"
HWND g_hWnd;
CGameEngine_Input GameEngine_Input;
IDirect3D9* g_pIDirect3D;
IDirect3DDevice9* g_pd3dDevice;
//摄影机
CCamera g_Camera;
const float ROTATE_ANGLE=0.01f;
const float MOVE_STEP=3.3f;
//地形
CLODTerrain* g_pTerrain;
//函数声明
bool CreateD3DDevice(HWND hWnd,bool bFullScreen);
bool DoFrame();
void SetupView();
void SetupProjection();
void Shutdown();
int APIENTRY WinMain(HINSTANCE hInstance, //传入的窗口句柄
HINSTANCE hPrevInstance, //已存在的窗口句柄
LPSTR lpCmdLine, //传入的命令行参数
int nCmdShow) //设置窗口的显示方式
{
CGameEngine_App GameEngine_App;
MSG msg;
if(!GameEngine_App.CreateWnd("4叉树地形例子",hInstance,hPrevInstance,nCmdShow)){
return false;
}
g_hWnd=GameEngine_App.GetHWnd(); //取得已创建的窗口句柄
if(!GameEngine_Input.CreateInput(hInstance,g_hWnd)){ //初始化输入设备
MessageBox(NULL,"初始化输入设备失败.","警告",MB_OK|MB_ICONINFORMATION);
return false;
}
ShowCursor(true);
if(!CreateD3DDevice(g_hWnd,true)){ //创建D3D设备
return false;
}
//初始化摄影机
D3DXVECTOR3 CameraPos=D3DXVECTOR3(500.0f,300.0f,1300.0f);
D3DXVECTOR3 CameraLookAtPos=D3DXVECTOR3(500.0f,0.0f,500.0f);
D3DXVECTOR3 CameraUpPos=D3DXVECTOR3(0.0f,1.0f,0.0f);
g_Camera.InitCamera(CameraPos,CameraLookAtPos,CameraUpPos);
//设置相应的摄影和投影变换
SetupView();
SetupProjection();
//创建地形
g_pTerrain=new CLODTerrain(g_pd3dDevice,true);
//初始化地形高度数据
if(!g_pTerrain->InitTerrain(_T("HeightMap.raw"),_T("mountainTex.tga"))){
MessageBox(NULL,"初始化地形数据失败.","提示",0);
return false;
}
//4叉树地形分割
g_pTerrain->UpdateTerrain(&g_Camera);
while(msg.message!=WM_QUIT){
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else{
if(DoFrame()==false) break; //渲染一帧地形
}
}
Shutdown();
UnregisterClass(WNDCLASSNAME, hInstance);
CoUninitialize(); //注销所有COM对象
return true;
}
bool CreateD3DDevice(HWND hWnd,bool bFullScreen){
//创建IDirect3D9对象
g_pIDirect3D=Direct3DCreate9(D3D_SDK_VERSION);
if(g_pIDirect3D==NULL){
return false;
}
D3DCAPS9 d3dcaps;
g_pIDirect3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&d3dcaps);
bool bHarwareProcess;
if(d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){
bHarwareProcess=true;
}
else{
bHarwareProcess=false;
}
//取得显示模式
D3DDISPLAYMODE d3dDisplayMode;
if(FAILED(g_pIDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3dDisplayMode))){
return false;
}
//设置d3d设备的渲染参数
D3DPRESENT_PARAMETERS d3dPresent_Param; //渲染参数结构体
ZeroMemory(&d3dPresent_Param, sizeof(d3dPresent_Param)); //结构体清0
d3dPresent_Param.BackBufferWidth=800;
d3dPresent_Param.BackBufferHeight=600;
d3dPresent_Param.BackBufferFormat=d3dDisplayMode.Format;
d3dPresent_Param.BackBufferCount=1;
d3dPresent_Param.hDeviceWindow=hWnd;
d3dPresent_Param.Windowed=!bFullScreen; //false为全屏幕显示方式
d3dPresent_Param.SwapEffect=D3DSWAPEFFECT_FLIP;
d3dPresent_Param.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
d3dPresent_Param.EnableAutoDepthStencil=TRUE;
d3dPresent_Param.AutoDepthStencilFormat=D3DFMT_D16;
//创建d3d设备
if(bHarwareProcess){
if(FAILED(g_pIDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dPresent_Param,
&g_pd3dDevice))){
return false;
}
}
else{
if(FAILED(g_pIDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dPresent_Param,
&g_pd3dDevice))){
return false;
}
}
return true;
}
bool DoFrame(){
if(GameEngine_Input.ReadKeyboard()){
if(GameEngine_Input.IsKeyPressed(DIK_ESCAPE)){
return false;
}
if(GameEngine_Input.IsKeyPressed(DIK_R) &&
GameEngine_Input.IsKeyPressed(DIK_RIGHT)){
g_Camera.RotateLookAxis(-ROTATE_ANGLE);
SetupView();
g_pTerrain->UpdateTerrain(&g_Camera);
}
if(GameEngine_Input.IsKeyPressed(DIK_R) &&
GameEngine_Input.IsKeyPressed(DIK_LEFT)){
g_Camera.RotateLookAxis(ROTATE_ANGLE);
SetupView();
g_pTerrain->UpdateTerrain(&g_Camera);
}
if(GameEngine_Input.IsKeyPressed(DIK_R) &&
GameEngine_Input.IsKeyPressed(DIK_UP)){
g_Camera.MoveAlongY(MOVE_STEP);
SetupView();
g_pTerrain->UpdateTerrain(&g_Camera);
}
if(GameEngine_Input.IsKeyPressed(DIK_R) &&
GameEngine_Input.IsKeyPressed(DIK_DOWN)){
g_Camera.MoveAlongY(-MOVE_STEP);
SetupView();
g_pTerrain->UpdateTerrain(&g_Camera);
}
if(GameEngine_Input.IsKeyPressed(DIK_UP)){
g_Camera.MoveAlongZ(MOVE_STEP);
SetupView();
g_pTerrain->UpdateTerrain(&g_Camera);
}
if(GameEngine_Input.IsKeyPressed(DIK_DOWN)){
g_Camera.MoveAlongZ(-MOVE_STEP);
SetupView();
g_pTerrain->UpdateTerrain(&g_Camera);
}
if(GameEngine_Input.IsKeyPressed(DIK_LEFT)){
g_Camera.MoveAlongX(-MOVE_STEP);
SetupView();
g_pTerrain->UpdateTerrain(&g_Camera);
}
if(GameEngine_Input.IsKeyPressed(DIK_RIGHT)){
g_Camera.MoveAlongX(MOVE_STEP);
SetupView();
g_pTerrain->UpdateTerrain(&g_Camera);
}
if(GameEngine_Input.IsKeyPressed(DIK_W)){
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
}
if(GameEngine_Input.IsKeyPressed(DIK_S)){
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
}
}
//渲染地形
g_pTerrain->Render();
return true;
}
//设置摄影机位置
void SetupView()
{
D3DXMATRIX ViewMat;
g_Camera.GetViewMatrix(&ViewMat);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&ViewMat);
}
//设置透视投影
void SetupProjection()
{
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/3, 1.0f, 100.0f, 100000.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj);
}
void Shutdown(){
delete g_pTerrain;g_pTerrain=NULL;
SafeRelease(g_pd3dDevice);
SafeRelease(g_pIDirect3D);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -