⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 里内面有两个关于地形的模拟的范例,仔细看一下会收获不小啊
💻 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 + -