D3D游戏编程系列(五):自己动手编写第一人称射击游戏之室外场景的构建
结束了上一节即时战略游戏的讲解,我们继续来到第一人称射击游戏的介绍,其实我感觉,真正要论游戏的复杂性,第一人称射击游戏绝对是最复杂的,尤其是室内场景的搭建和渲染,不过自己水平有限,而且也没人帮我建模,所以我们就已一个简单的室外场景为例说明下。
首先,室外场景怎么搭建,我们需要一个地图,这个地图的来源有很多种,我这里介绍很简单的一种,就是利用数组来构建地图,形式如下:
int MapTemp[20][20]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
};
其中0代表可以通行的路径,1代表墙壁,那么怎么去应用这个地图数组呢,首先,我们要构造墙壁和地面的Mesh对象,然后通过D3DXMatrixTranslation来建立一个位移矩阵,讲Mesh移动到相应的位置上去。构建地图的代码如下:
void CDXOctNode::_Render( CDXOctNode* pNode,D3DXPLANE* Planes,bool bCheck ){if(bCheck){bool bFullContained;if(_CheckInFrustum(pNode->m_MinVec,pNode->m_MaxVec,Planes,&bFullContained)){if(pNode->m_bSort==true){for(int i=0;i<8;i++){_Render(pNode->m_pChildNode[i],Planes,!bFullContained);}}else{if(pNode->m_EntityList.size()>0){list<CDXEntity*>::iterator it;for(it=pNode->m_EntityList.begin();it!=pNode->m_EntityList.end();it++){CDXEntity *pEntity=*it;bool bFull;if(_CheckInFrustum(pEntity->m_BoundMin,pEntity->m_BoundMax,Planes,&bFull)){pEntity->Render();}}}}}}else{if(pNode->m_bSort==true){for(int i=0;i<8;i++){_Render(pNode->m_pChildNode[i],Planes,false);}}else{if(pNode->m_EntityList.size()>0){list<CDXEntity*>::iterator it;for(it=pNode->m_EntityList.begin();it!=pNode->m_EntityList.end();it++){CDXEntity *pEntity=*it;pEntity->Render();}}}}} 文章有不足之处,还望各位多多指正。