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

📄 main.cpp

📁 BillboardDemo基于VS.net和DX9的广告版程序实例
💻 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 + -