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

📄 cgame.cpp

📁 骨骼动画 此程序演示了如何在你的游戏中使用骨骼动画技术。
💻 CPP
字号:
#include "CGame.h"


int    g_iRenderInWireFrame = 1;
ID3DXMesh* Teapot = 0;

CGame::CGame():
m_pD3D(NULL),
m_pDevice(NULL),
m_bDeviceLost(false),
m_pInformation(NULL),
m_pSkyBox(NULL),
m_pCamera(NULL),
TheCTerrain(NULL),
m_pMesh(NULL),
m_bSleep(false)
{
}

CGame::~CGame(void)
{	
	SAFE_DELETE(m_pMesh);
	SAFE_DELETE(TheCTerrain);
	SAFE_DELETE(m_pCamera);
	SAFE_DELETE(m_pSkyBox);
	SAFE_DELETE(m_pInformation);
	SAFE_RELEASE(m_pDevice);
	SAFE_RELEASE(m_pD3D);
}
void CGame::setmatWorld()
{
	D3DXMATRIX matWorld, matView,matProj;//创建矩阵
	D3DXVECTOR3 eye( 0, 3, -10 );//向量x = 0, y = 0, z = -10 视口的位置
	D3DXVECTOR3 look( 0, 0, 0 );//向量x = 0, y = 0, z = 0 (原点)视口朝向的位置
	D3DXVECTOR3 up( 0, 1, 0 );//向量x = 0, y = 1, z = 0 视口的正方向 
	D3DXMatrixLookAtLH( &matView, &eye, &look, &up );//定义视图转换矩阵
	m_pDevice->SetTransform( D3DTS_VIEW, &matView );//视图变换

	//透视投影变换
	D3DXMatrixPerspectiveFovLH( 
		&matProj, 
		D3DXToRadian( 45.0f ),	                             
		800.0f / 600.0f, 
		1.0f,
		1000.0f );//定义透视变换矩阵(45度夹角)
	//////////////////////////////////////////////////////////////////////////
	m_pDevice->SetTransform( D3DTS_PROJECTION, &matProj );//透视投影变换	  //
	/////////////////////////////////////////////////////////////////////////////

	D3DXMatrixIdentity(&matWorld);	///单位划世界矩阵
	/////////////////////////////////////////////////////////////////
	D3DXMatrixTranslation( &matWorld, 0, 0, 1);	//设置世界转换坐标点
	/////////////////////////////////////////////////////////////////
	m_pDevice->SetRenderState( D3DRS_LIGHTING, FALSE );		 /////设置灯光关闭
//	m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );	// //设置以线形绘制(默认以面绘制)
	m_pDevice->SetTransform(D3DTS_WORLD,&matWorld);//设置世界转换
}
bool CGame::Init(HINSTANCE hInstance, HWND hWnd)
{
	//COM初始化	
	CoInitialize(NULL);
	//如果初始化D3D返回FALSE;
	if (FAILED(InitD3D(hWnd)))
	{
		return false;
	}
	setmatWorld();
	//////////////设置字体,newFPS对象/////////////////////////////////////
	m_pInformation = new CInformation(m_pDevice,hWnd);
		
	return true;
}

HRESULT CGame::InitD3D(HWND hWnd)
{
	//创建Direct3D的COM的接口对象
	if (NULL==(m_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
	{
		::MessageBox(0, "错误:创建D3D的COM接口 - 失败", 0, 0);
		return E_FAIL;
	}
	//////////获取硬件显示模式
	D3DDISPLAYMODE d3ddm;
	if (FAILED(m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
	{
		::MessageBox(0, "错误:获取硬件显示模式 - 失败", 0, 0);
		return E_FAIL;
	}
	//////////////////////
	RECT rect;
	GetClientRect(hWnd,&rect);
	///////////////////////
	ZeroMemory(&m_d3dpp,sizeof(m_d3dpp));

	m_d3dpp.Windowed=TRUE;//FALSE
	m_d3dpp.BackBufferCount=1;
	m_d3dpp.BackBufferFormat=d3ddm.Format;
	m_d3dpp.BackBufferWidth=rect.right-rect.left;
	m_d3dpp.BackBufferHeight=rect.bottom-rect.top;
	m_d3dpp.hDeviceWindow=hWnd;
	m_d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
	m_d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
	m_d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
	m_d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
	m_d3dpp.EnableAutoDepthStencil=TRUE;
	/////////////创建D3D设备/////
	if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&m_d3dpp,&m_pDevice)))
	   {
		::MessageBox(0, "错误:创建D3D设备 - 失败", 0, 0);
		 return E_FAIL;
	   }
	//////////初始化及加载天空盒///////////////////////////////
	m_pSkyBox = new CSkyBox;
	m_pSkyBox->Init( ".\\sky\\cloudy_", m_pDevice );;
	m_pCamera = new CCamera;
	m_pCamera->setPosition(&D3DXVECTOR3(1.0f, 1.0f, 1.0f));
	m_pMesh = new CSkinMesh( m_pDevice );
	m_pMesh->LoadFromXFile( ".\\Hero.X" );  
	/////////初始化地形///////////////////////////////
	TheCTerrain = new CTerrain();
	TheCTerrain->Init( m_pDevice,100.f,100.f,64,64,20.f ,"terrain_heightmap.png",4,
		                 "terrain_texture.dds",  "terrain_detail.dds", 2);
	//TheCTerrain->Init(m_pDevice,100.f,10.f ,"terrain_heightmap.png",4,
	//	                 "terrain_texture.dds",  "terrain_detail.dds", 2);
	/*TheCTerrain->Init( m_pDevice,50.f,100.f,100,100,1 ,
		                 "terrain_texture.dds",  "terrain_detail.dds", 2);*/
	//TheCTerrain->InitHeightMap(m_pDevice,100.f,100.f,64,64,50.f ,"coastMountain64.raw",
	//	                 "terrain_texture.dds",  "terrain_detail.dds", 2);
	return S_OK;
}

void CGame::Update(float fElapsedTime)
{
	if(!m_bSleep)//控制了窗口不在激活状态时,不捕获按键信息
	{
		m_pCamera->ProcesKey(m_pDevice,fElapsedTime);
	    m_pCamera->Update( m_pDevice, fElapsedTime );
		D3DXVECTOR3  _pos1;
		 m_pCamera->getPosition(&_pos1);
		_pos1.y = TheCTerrain->getHeight(_pos1.x,_pos1.z)+2;
		m_pCamera->setPosition(&_pos1);
	}
}
int id = 1;
void CGame::Render(float fElapsedTime)
{
	//在每次渲染前判断是否发生设备丢失
	HRESULT hr;

	//后备缓冲区须于窗口大小一致才能正确获取D3DERR_DEVICENOTRESET
	//否则检测系统协调层级只能获得D3DERR_DEVICELOST
	if (true==m_bDeviceLost)
	{
		Sleep(100);//100 mill时间
		//检查系统协调层级,系统可以证据函数返回值判断设备丢失时采用的措施
		if (FAILED(hr=m_pDevice->TestCooperativeLevel()))
		{
			if (hr==D3DERR_DEVICELOST)
			{
				return;
			}
			//设备丢失能够被自动重置,这时候返回进行再次尝试
			if (hr==D3DERR_DEVICENOTRESET)
			{
				//调用Reset函数重置设备
				hr=m_pDevice->Reset(&m_d3dpp);
				if (FAILED(hr))
				{
					return;
				}
				return;
			}
		}
		m_bDeviceLost=false;
	}

	
	//static	float timeStart = timeGetTime()/1000.0f;
	//static	float timeNow = timeGetTime()/1000.0f;
	//float tFrameTime = timeNow;
	//timeNow = timeGetTime()/1000.0f;
	//tFrameTime = timeNow - tFrameTime;

	
	m_pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
					D3DCOLOR_XRGB(0,0,0),1.0F,0);
	m_pDevice->BeginScene();
	m_pMesh->Render( fElapsedTime, D3DXVECTOR3(-100,0,250),3.14 );
	/////////////////////渲染天空盒/////////////////////////////////////////////
	D3DXMATRIX matWorld;
	D3DXMatrixTranslation( &matWorld,0.0f,0.0f,0.0f );
	m_pSkyBox->Render( matWorld );	
	/////////////////////渲染地面/////////////////////////////////////////////
	D3DXMatrixTranslation( &matWorld,-100.0f,-20.0f,-20.0f );
	TheCTerrain->Render(matWorld);
	///////////在屏幕上输出FPS和鼠标POS信息/////////////////////////
	m_pInformation->drawFPS(fElapsedTime);
	m_pInformation->drawCursorPos();
	D3DXVECTOR3 pos;
	m_pCamera->getPosition(&pos);
	m_pInformation->drawCameraPos(pos);
	

	m_pDevice->EndScene();
	hr=m_pDevice->Present(NULL,NULL,NULL,NULL);
	if (hr==D3DERR_DEVICELOST)
	{
		::MessageBox(0, "错误:设备丢失", 0, 0);
		m_bDeviceLost=true;
	}
}

void CGame::HandleMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	if(m_pCamera)
		m_pCamera->HandleMessage(hWnd, message, wParam, lParam);
	switch(wParam)
	{
		 case VK_F2:
					g_iRenderInWireFrame++;
					switch(g_iRenderInWireFrame)
					{
					case 1:
						 m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
						 break;
					case 2:
						 m_pDevice->SetRenderState( D3DRS_FILLMODE,  D3DFILL_POINT );
						 break;
					case 3:
						 m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
						 break;
					case 4:
						m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
						g_iRenderInWireFrame = 1;
						break;
					}
                   /* g_bRenderInWireFrame = !g_bRenderInWireFrame;
                    if( g_bRenderInWireFrame == true )
                        g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
                    else
                        g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );*/
                break;			
	case WM_KEYDOWN :
		break;
	default:
	    break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -