?? main.cpp
字號(hào):
#include "main.h"
//頂點(diǎn)自定義格式
#define CUSTOMVERTEX_FVF D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1
struct CUSTOMVERTEX{
D3DXVECTOR3 vertexPos; //xyz坐標(biāo)
D3DXVECTOR3 vertexNor; //法向量坐標(biāo)
D3DXVECTOR2 vertexTex; //uv紋理坐標(biāo)
};
CGameEngine_App GameEngine_App;
CGameEngine_Input GameEngine_Input;
CGameEngine_SceneManager GameEngine_SceneManager;
CGameEngine_Camera GameEngine_Camera; //攝影機(jī)
CGameEngine_Light* pGameEngine_Light; //光線
//點(diǎn)光源位置(1.0f表示點(diǎn)光源)
D3DXVECTOR4 PointLightPos(50.0f,200.0f,50.0f,1.0f);
//墻壁和地面簡(jiǎn)單地使用同一個(gè)材質(zhì)
CGameEngine_Material* pGameEngine_Material;
//陰影材質(zhì)
CGameEngine_Material* pShadowMaterial;
//墻壁地面頂點(diǎn)緩沖和紋理
CGameEngine_VertexBuffer* pGameEngine_WallGroundVB;
CGameEngine_Texture* pWallGroundTex[3];
//彈地球網(wǎng)格、紋理、位置和世界變換矩陣
ID3DXMesh* pSphereMesh=NULL;
CGameEngine_Texture* pSphereTex;
D3DXVECTOR3 vSpherePos;
D3DXMATRIX matSphereTrans;
//彈地球下墜或彈起標(biāo)志
bool bSphereDrop=true;
//攝影機(jī)移動(dòng)步長(zhǎng)和旋轉(zhuǎn)角度大小
#define MOVE_STEP 1.0f
#define ROTATE_ANGLE 0.01f
//函數(shù)原型聲明
bool DoFrame();
void LeftWallShadowRender();
void FrontWallShadowRender();
void GroundShadowRender();
void GroundWallRender();
void Shutdown();
//
int APIENTRY WinMain(HINSTANCE hInstance, //傳入的窗口句柄
HINSTANCE hPrevInstance, //已存在的窗口句柄
LPSTR lpCmdLine, //傳入的命令行參數(shù)
int nCmdShow) //設(shè)置窗口的顯示方式
{
MSG msg;
if(!GameEngine_App.CreateWnd("蒙板和陰影例子",hInstance,hPrevInstance,nCmdShow)){
return false;
}
HWND hWnd=GameEngine_App.GetHWnd(); //取得已創(chuàng)建的窗口句柄
if(!GameEngine_Input.CreateInput(hInstance,hWnd)){ //初始化輸入設(shè)備
MessageBox(NULL,"初始化輸入設(shè)備失敗.","警告",MB_OK|MB_ICONINFORMATION);
return false;
}
//初始化游戲場(chǎng)景(包括創(chuàng)建3D設(shè)備)
GameEngine_SceneManager.Init();
if(!GameEngine_SceneManager.SetRenderMode(hWnd,true,800,600)){
MessageBox(NULL,_T("創(chuàng)建設(shè)備失敗"),_T("提示"),0);
return false;
}
//初始化墻壁地板頂點(diǎn)緩沖區(qū)
pGameEngine_WallGroundVB=new CGameEngine_VertexBuffer(&GameEngine_SceneManager);
pGameEngine_WallGroundVB->Create(4*3,CUSTOMVERTEX_FVF); //12個(gè)頂點(diǎn)
pGameEngine_WallGroundVB->Lock(0,4*3);
CUSTOMVERTEX* pVertexData=(CUSTOMVERTEX*)pGameEngine_WallGroundVB->GetVBDataPt();
//寫墻壁地板頂點(diǎn)數(shù)據(jù)
float fEdgeLength=100.0f;
//前面的墻壁
pVertexData->vertexPos=D3DXVECTOR3(0.0f,0.0f,fEdgeLength);
pVertexData->vertexNor=D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertexData->vertexTex=D3DXVECTOR2(0.0f,0.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(0.0f,fEdgeLength,fEdgeLength);
pVertexData->vertexNor=D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertexData->vertexTex=D3DXVECTOR2(0.0f,1.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(fEdgeLength,0,fEdgeLength);
pVertexData->vertexNor=D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertexData->vertexTex=D3DXVECTOR2(1.0,0.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(fEdgeLength,fEdgeLength,fEdgeLength);
pVertexData->vertexNor=D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertexData->vertexTex=D3DXVECTOR2(1.0f,1.0f);
pVertexData++;
//左側(cè)墻壁
pVertexData->vertexPos=D3DXVECTOR3(0.0f,0.0f,0.0f);
pVertexData->vertexNor=D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertexData->vertexTex=D3DXVECTOR2(0.0f,0.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(0.0f,fEdgeLength,0.0f);
pVertexData->vertexNor=D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertexData->vertexTex=D3DXVECTOR2(0.0f,1.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(0.0f,0.0f,fEdgeLength);
pVertexData->vertexNor=D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertexData->vertexTex=D3DXVECTOR2(1.0f,0.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(0.0f,fEdgeLength,fEdgeLength);
pVertexData->vertexNor=D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertexData->vertexTex=D3DXVECTOR2(1.0f,1.0f);
pVertexData++;
//地板頂點(diǎn)數(shù)據(jù)
pVertexData->vertexPos=D3DXVECTOR3(fEdgeLength,0,fEdgeLength);
pVertexData->vertexNor=D3DXVECTOR3(0.0f,1.0f,0.0f);
pVertexData->vertexTex=D3DXVECTOR2(1.0f,1.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(fEdgeLength,0.0f,0.0f);
pVertexData->vertexNor=D3DXVECTOR3(0.0f,1.0f,0.0f);
pVertexData->vertexTex=D3DXVECTOR2(1.0f,0.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(0.0f,0.0f,fEdgeLength);
pVertexData->vertexNor=D3DXVECTOR3(0.0f,1.0f,0.0f);
pVertexData->vertexTex=D3DXVECTOR2(0.0f,1.0f);
pVertexData++;
pVertexData->vertexPos=D3DXVECTOR3(0.0f,0.0f,0.0f);
pVertexData->vertexNor=D3DXVECTOR3(0.0f,1.0f,0.0f);
pVertexData->vertexTex=D3DXVECTOR2(0.0f,0.0f);
pVertexData++;
//解鎖
pGameEngine_WallGroundVB->Unlock();
//創(chuàng)建紋理
for(int i=0;i<3;i++){
pWallGroundTex[i]=new CGameEngine_Texture(&GameEngine_SceneManager);
}
pWallGroundTex[0]->LoadTexture(_T("front.bmp"));
pWallGroundTex[1]->LoadTexture(_T("left.bmp"));
pWallGroundTex[2]->LoadTexture(_T("ground.bmp"));
//光線
GameEngine_SceneManager.GetDevice()->SetRenderState(D3DRS_NORMALIZENORMALS,true);
pGameEngine_Light=new CGameEngine_Light(); //默認(rèn)為點(diǎn)光源
pGameEngine_Light->SetDiffuseColor(255,0,0,255);
pGameEngine_Light->SetAmbientColor(0,200,0,255);
pGameEngine_Light->SetSpecularColor(0,0,0,255);
pGameEngine_Light->SetLightPos(PointLightPos.x,PointLightPos.y,PointLightPos.z);
GameEngine_SceneManager.EnableLight(0,true);
GameEngine_SceneManager.OpenSceneLight(true);
GameEngine_SceneManager.SetLight(0,pGameEngine_Light);
//墻壁、地面和彈地球的材質(zhì)(對(duì)光的反射屬性)
pGameEngine_Material=new CGameEngine_Material();
pGameEngine_Material->SetAmbientColor(255,255,0,0);
pGameEngine_Material->SetDiffuseColor(255,255,0,0);
pGameEngine_Material->SetSpecularColor(0,0,0,0);
pGameEngine_Material->SetEmissiveColor(255,255,0,0);
pGameEngine_Material->SetPower(1.0f);
//陰影材質(zhì)(默認(rèn)黑色)
pShadowMaterial=new CGameEngine_Material();
pShadowMaterial->SetDiffuseColor(0,0,0,125); //alpha半透明
//創(chuàng)建一個(gè)彈地球
D3DXCreateSphere(GameEngine_SceneManager.GetDevice(),
5.0f,20,20,&pSphereMesh,NULL);
pSphereTex=new CGameEngine_Texture(&GameEngine_SceneManager);
pSphereTex->LoadTexture(_T("sphere.bmp"));
//彈地球的初始位置
vSpherePos=D3DXVECTOR3(10.0f,30.0f,90.0f);
//初始化攝影機(jī)
D3DXVECTOR3 CameraPos=D3DXVECTOR3(50.0f,10.0f,10.0f);
D3DXVECTOR3 CameraLookAtPos=D3DXVECTOR3(0.0f,0.0f,100.0f);
D3DXVECTOR3 CameraUpPos=D3DXVECTOR3(0.0f,1.0f,0.0f);
GameEngine_Camera.InitCamera(CameraPos,CameraLookAtPos,CameraUpPos);
//
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對(duì)象
return true;
}
//幀渲染函數(shù)
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.RotateYAxis(ROTATE_ANGLE);
}
if(GameEngine_Input.IsKeyPressed(DIK_R) && GameEngine_Input.IsKeyPressed(DIK_LEFT)){
GameEngine_Camera.RotateYAxis(-ROTATE_ANGLE);
}
if(GameEngine_Input.IsKeyPressed(DIK_R) && GameEngine_Input.IsKeyPressed(DIK_UP)){
GameEngine_Camera.MoveAlongY(MOVE_STEP);
}
if(GameEngine_Input.IsKeyPressed(DIK_R) && GameEngine_Input.IsKeyPressed(DIK_DOWN)){
GameEngine_Camera.MoveAlongY(-MOVE_STEP);
}
if(GameEngine_Input.IsKeyPressed(DIK_LEFT)){
GameEngine_Camera.MoveAlongX(MOVE_STEP);
}
if(GameEngine_Input.IsKeyPressed(DIK_RIGHT)){
GameEngine_Camera.MoveAlongX(-MOVE_STEP);
}
if(GameEngine_Input.IsKeyPressed(DIK_UP)){
GameEngine_Camera.MoveAlongZ(MOVE_STEP);
}
if(GameEngine_Input.IsKeyPressed(DIK_DOWN)){
GameEngine_Camera.MoveAlongZ(-MOVE_STEP);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -