📄 main.cpp
字号:
#include "main.h"
#define CUSTOMVERTEX_FVF D3DFVF_XYZ|D3DFVF_TEX1
struct CUSTOMVERTEX{
D3DXVECTOR3 vertexPos; //xyz坐标
D3DXVECTOR2 vertexTex; //uv纹理坐标
};
#define fDTOR D3DX_PI/180
CGameEngine_App GameEngine_App;
CGameEngine_Input GameEngine_Input;
CGameEngine_SceneManager GameEngine_SceneManager;
CGameEngine_Camera GameEngine_Camera;
CGameEngine_VertexBuffer* pGameEngine_SkyVB;
CGameEngine_VertexBuffer* pGameEngine_FloorVB;
CGameEngine_Texture* pSkyTexture;
CGameEngine_Texture* pFloorTexture;
int NumSkyVertices;
#define MOVE_STEP 3.0f
#define ROTATE_ANGLE 0.01f
//
CGameEngine_Texture* pTreeTexture1;
D3DXVECTOR3 treePos1;
CGameEngine_Texture* pTreeTexture2;
D3DXVECTOR3 treePos2;
bool DoFrame();
float MyAtan2(float z,float x);
void Shutdown();
int APIENTRY WinMain(HINSTANCE hInstance, //传入的窗口句柄
HINSTANCE hPrevInstance, //已存在的窗口句柄
LPSTR lpCmdLine, //传入的命令行参数
int nCmdShow) //设置窗口的显示方式
{
MSG msg;
if(!GameEngine_App.CreateWnd("圆形天空例子",hInstance,hPrevInstance,nCmdShow)){
return false;
}
HWND hWnd=GameEngine_App.GetHWnd(); //取得已创建的窗口句柄
if(!GameEngine_Input.CreateInput(hInstance,hWnd)){ //初始化输入设备
MessageBox(NULL,"初始化输入设备失败.","警告",MB_OK|MB_ICONINFORMATION);
return false;
}
//初始化游戏场景(包括创建3D设备)
GameEngine_SceneManager.Init();
if(!GameEngine_SceneManager.SetRenderMode(hWnd,true,1024,768)){
MessageBox(NULL,_T("创建设备失败"),_T("提示"),0);
return false;
}
//初始化天空顶点缓冲区
int alfa,beta;
int dalfa=15;
int dbeta=15;
float radius=1800.0f;
NumSkyVertices=(int)((360/dalfa)*(90/dbeta)*4);
pGameEngine_SkyVB=new CGameEngine_VertexBuffer(&GameEngine_SceneManager);
pGameEngine_SkyVB->Create(NumSkyVertices,CUSTOMVERTEX_FVF);
pGameEngine_SkyVB->Lock(0,NumSkyVertices);
CUSTOMVERTEX* pVertexData=(CUSTOMVERTEX*)pGameEngine_SkyVB->GetVBDataPt();
//写圆形天空顶点数据
for(alfa=0;alfa+dalfa<=360;alfa+=dalfa){
for(beta=0;beta+dbeta<=90;beta+=dbeta){
pVertexData->vertexPos=D3DXVECTOR3(radius*cosf(beta*fDTOR)*cosf(alfa*fDTOR),
radius*sinf(beta*fDTOR),
radius*cosf(beta*fDTOR)*sinf(alfa*fDTOR));
pVertexData->vertexTex=D3DXVECTOR2(MyAtan2(pVertexData->vertexPos.z,pVertexData->vertexPos.x)/(2*D3DX_PI),
(float)asin((pVertexData->vertexPos.y)/radius)/D3DX_PI+0.5f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(radius*cosf(beta*fDTOR)*cosf((alfa+dalfa)*fDTOR),
radius*sinf(beta*fDTOR),
radius*cosf(beta*fDTOR)*sinf((alfa+dalfa)*fDTOR));
pVertexData->vertexTex=D3DXVECTOR2(MyAtan2(pVertexData->vertexPos.z,pVertexData->vertexPos.x)/(2*D3DX_PI),
(float)asin((pVertexData->vertexPos.y)/radius)/D3DX_PI+0.5f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(radius*cosf((beta+dbeta)*fDTOR)*cosf(alfa*fDTOR),
radius*sinf((beta+dbeta)*fDTOR),
radius*cosf((beta+dbeta)*fDTOR)*sinf(alfa*fDTOR));
pVertexData->vertexTex=D3DXVECTOR2(MyAtan2(pVertexData->vertexPos.z,pVertexData->vertexPos.x)/(2*D3DX_PI),
(float)asin((pVertexData->vertexPos.y)/radius)/D3DX_PI+0.5f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(radius*cosf((beta+dbeta)*fDTOR)*cosf((alfa+dalfa)*fDTOR),
radius*sinf((beta+dbeta)*fDTOR),
radius*cosf((beta+dbeta)*fDTOR)*sinf((alfa+dalfa)*fDTOR));
pVertexData->vertexTex=D3DXVECTOR2(MyAtan2(pVertexData->vertexPos.z,pVertexData->vertexPos.x)/(2*D3DX_PI),
(float)asin((pVertexData->vertexPos.y)/radius)/D3DX_PI+0.5f);
pVertexData++;
}
}
//解锁
pGameEngine_SkyVB->Unlock();
//创建天空面的纹理
pSkyTexture=new CGameEngine_Texture(&GameEngine_SceneManager);
pSkyTexture->LoadTexture(_T("sky.jpg"));
//地面
pGameEngine_FloorVB=new CGameEngine_VertexBuffer(&GameEngine_SceneManager);
pGameEngine_FloorVB->Create(4,CUSTOMVERTEX_FVF); //4个顶点
pGameEngine_FloorVB->Lock(0,4);
pVertexData=(CUSTOMVERTEX*)pGameEngine_FloorVB->GetVBDataPt();
//地面顶点数据
float fDist=2300.0f;
pVertexData->vertexPos=D3DXVECTOR3(fDist,0,fDist);
pVertexData->vertexTex=D3DXVECTOR2(1,1);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(fDist,0,-fDist);
pVertexData->vertexTex=D3DXVECTOR2(1,0);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(-fDist,0,fDist);
pVertexData->vertexTex=D3DXVECTOR2(0,1);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(-fDist,0,-fDist);
pVertexData->vertexTex=D3DXVECTOR2(0,0);
pVertexData++;
//
pGameEngine_FloorVB->Unlock();
//创建地面的纹理
pFloorTexture=new CGameEngine_Texture(&GameEngine_SceneManager);
pFloorTexture->LoadTexture(_T("floor.bmp"));
//树1的纹理
pTreeTexture1=new CGameEngine_Texture(&GameEngine_SceneManager);
pTreeTexture1->LoadTexture(_T("tree1.dds"));
//树1的位置
long lTreeHeight;
pTreeTexture1->GetPicHeight(lTreeHeight);
treePos1.x=50.0f;treePos1.y=lTreeHeight-1.5f;treePos1.z=1000.0f;
//树2的纹理
pTreeTexture2=new CGameEngine_Texture(&GameEngine_SceneManager);
pTreeTexture2->LoadTexture(_T("tree2.dds"));
//树2的位置
pTreeTexture2->GetPicHeight(lTreeHeight);
treePos2.x=500.0f;treePos2.y=lTreeHeight-1.5f;treePos2.z=1500.0f;
//初始化摄影机
D3DXVECTOR3 CameraPos=D3DXVECTOR3(0.0f,30.0f,0.0f);
D3DXVECTOR3 CameraLookAtPos=D3DXVECTOR3(0.0f,0.0f,100000.0f);
D3DXVECTOR3 CameraUpPos=D3DXVECTOR3(0.0f,1.0f,0.0f);
GameEngine_Camera.InitCamera(CameraPos,CameraLookAtPos,CameraUpPos);
//
msg.message=WM_SETFOCUS;
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 DoFrame(){
if(GameEngine_Input.ReadKeyboard()){
if(GameEngine_Input.IsKeyPressed(DIK_ESCAPE)){
return false;
}
if(GameEngine_Input.IsKeyPressed(DIK_R) && GameEngine_Input.IsKeyPressed(DIK_RIGHT)){
GameEngine_Camera.RotateRightAxis(ROTATE_ANGLE);
}
else if(GameEngine_Input.IsKeyPressed(DIK_R) && GameEngine_Input.IsKeyPressed(DIK_LEFT)){
GameEngine_Camera.RotateRightAxis(-ROTATE_ANGLE);
}
else if(GameEngine_Input.IsKeyPressed(DIK_R) && GameEngine_Input.IsKeyPressed(DIK_UP)){
GameEngine_Camera.MoveAlongY(MOVE_STEP);
}
else if(GameEngine_Input.IsKeyPressed(DIK_R) && GameEngine_Input.IsKeyPressed(DIK_DOWN)){
GameEngine_Camera.MoveAlongY(-MOVE_STEP);
}
else if(GameEngine_Input.IsKeyPressed(DIK_LEFT)){
GameEngine_Camera.MoveAlongX(MOVE_STEP);
}
else if(GameEngine_Input.IsKeyPressed(DIK_RIGHT)){
GameEngine_Camera.MoveAlongX(-MOVE_STEP);
}
else if(GameEngine_Input.IsKeyPressed(DIK_UP)){
GameEngine_Camera.MoveAlongZ(MOVE_STEP);
}
else if(GameEngine_Input.IsKeyPressed(DIK_DOWN)){
GameEngine_Camera.MoveAlongZ(-MOVE_STEP);
}
}
GameEngine_SceneManager.SetCamera(&GameEngine_Camera);
//设置投影变换
GameEngine_SceneManager.SetProjection(70);
//渲染圆形天空
GameEngine_SceneManager.ClearSZ();
GameEngine_SceneManager.BeginRender();
pGameEngine_SkyVB->SendData();
GameEngine_SceneManager.SetTexture(0,pSkyTexture);
for(int i=0;i<=NumSkyVertices/4;i++){
pGameEngine_SkyVB->Render(i*4,2,D3DPT_TRIANGLESTRIP);
}
//渲染地面
pGameEngine_FloorVB->SendData();
GameEngine_SceneManager.SetTexture(0,pFloorTexture);
pGameEngine_FloorVB->Render(0,1,D3DPT_TRIANGLESTRIP);
//
//渲染树1
GameEngine_SceneManager.SetSpriteAt(&treePos1,&GameEngine_Camera);
GameEngine_SceneManager.DrawSprite(pTreeTexture1);
//渲染树2
GameEngine_SceneManager.SetSpriteAt(&treePos2,&GameEngine_Camera);
GameEngine_SceneManager.DrawSprite(pTreeTexture2);
GameEngine_SceneManager.EndRender();
return true;
}
float MyAtan2(float z,float x){
if(z>=0)
return (float)atan2(z,x);
else // z<0
return ((float)atan2(z,x) + 2*D3DX_PI);
}
void Shutdown(){
delete pGameEngine_SkyVB;
delete pGameEngine_FloorVB;
delete pFloorTexture;
delete pSkyTexture;
delete pTreeTexture1;
delete pTreeTexture2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -