📄 main.cpp
字号:
#include "main.h"
//顶点自定义格式
#define CUSTOMVERTEX_FVF D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1
struct CUSTOMVERTEX{
D3DXVECTOR3 vertexPos; //xyz坐标
D3DXVECTOR3 vertexNor; //法向量坐标
D3DXVECTOR2 vertexTex; //uv纹理坐标
};
CGameEngine_App GameEngine_App;
CGameEngine_Input GameEngine_Input;
CGameEngine_SceneManager GameEngine_SceneManager;
CGameEngine_Camera GameEngine_Camera; //摄影机
CGameEngine_Light* pGameEngine_Light; //光线
//点光源位置(1.0f表示点光源)
D3DXVECTOR4 PointLightPos(50.0f,200.0f,50.0f,1.0f);
//墙壁和地面简单地使用同一个材质
CGameEngine_Material* pGameEngine_Material;
//阴影材质
CGameEngine_Material* pShadowMaterial;
//墙壁地面顶点缓冲和纹理
CGameEngine_VertexBuffer* pGameEngine_WallGroundVB;
CGameEngine_Texture* pWallGroundTex[3];
//弹地球网格、纹理、位置和世界变换矩阵
ID3DXMesh* pSphereMesh=NULL;
CGameEngine_Texture* pSphereTex;
D3DXVECTOR3 vSpherePos;
D3DXMATRIX matSphereTrans;
//弹地球下坠或弹起标志
bool bSphereDrop=true;
//摄影机移动步长和旋转角度大小
#define MOVE_STEP 1.0f
#define ROTATE_ANGLE 0.01f
//函数原型声明
bool DoFrame();
void LeftWallShadowRender();
void FrontWallShadowRender();
void GroundShadowRender();
void GroundWallRender();
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,800,600)){
MessageBox(NULL,_T("创建设备失败"),_T("提示"),0);
return false;
}
//初始化墙壁地板顶点缓冲区
pGameEngine_WallGroundVB=new CGameEngine_VertexBuffer(&GameEngine_SceneManager);
pGameEngine_WallGroundVB->Create(4*3,CUSTOMVERTEX_FVF); //12个顶点
pGameEngine_WallGroundVB->Lock(0,4*3);
CUSTOMVERTEX* pVertexData=(CUSTOMVERTEX*)pGameEngine_WallGroundVB->GetVBDataPt();
//写墙壁地板顶点数据
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++;
//左侧墙壁
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++;
//地板顶点数据
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();
//创建纹理
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(); //默认为点光源
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);
//墙壁、地面和弹地球的材质(对光的反射属性)
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);
//阴影材质(默认黑色)
pShadowMaterial=new CGameEngine_Material();
pShadowMaterial->SetDiffuseColor(0,0,0,125); //alpha半透明
//创建一个弹地球
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);
//初始化摄影机
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对象
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.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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -