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

📄 main.cpp

📁 这个代码关键是处理阴影的,还有纹理材质方面的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -