首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

D3D游戏编程系列(5):自己动手编写第一人称射击游戏之室外场景的构建

2013-10-13 
D3D游戏编程系列(五):自己动手编写第一人称射击游戏之室外场景的构建结束了上一节即时战略游戏的讲解,我们

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();}}}}}

        最后所有需要渲染的物体会保存在一个渲染列表里,然后做相应的变换并渲染。当然我这个八叉树渲染做的也有很多不足的地方,比如说材质的切换,这个是一个非常消耗资源的操作,如何可以把相同的材质的顶点统一渲染,那么渲染的效率必将提升一个档次。

       文章有不足之处,还望各位多多指正。

          

热点排行