基于DirectX的飞行射击游戏引擎实现要点

基于DirectX的飞行射击游戏引擎实现要点


2024年3月17日发(作者:)

第22卷 

第l0期 

重庆工学院学报(自然科学) 

2008年l0月 

V01.22 

No.10 

Journal of Chongqing Institute of Technology(Natural Science) 

Oct.2008 

基于DirectX的飞行射击游戏引擎实现要点 

陈占锋,谭会辛 

(重庆大学软件学院,重庆4ooo44) 

Key Technologies of Flight Shoot Game Engine Based on DirectX 

cHEN Zhan—feng,TAN Hui.xin 

(College of Software Engineering,Chongqing University,Chongqing 4OO044,China) 

Abstract:This paper introduces the design of a flight shoot game engine,which is implemented with the 

technology of multimedia interface DirectX,and its components based OH the windows platform,and sys— 

tematically discusses the key technologies of collision detection,the realization of bullet,the enemy flight 

route realized by configuration files,the realization of sprite.At the same time it introduces the use ofDi— 

rectInput and DirectSound.Finally it desings and implements an integratde game by the engine. 

Key words:DireetX;game engine;flight shoot game 

游戏开发的关键在于引擎.游戏引擎包括了 

难重重,且使得开发出的作品乏善可陈.同时,从 

套完整的游戏开发工具与运行环境,包含了开 国外引进游戏引擎价格昂贵,很多中小企业买不 

发一套游戏所需的最核心的技术.使用游戏引擎, 

起、用不好,长期被关在自主研发的大门之外.这 

游戏开发人员可以不用花过多精力去处理系统架 些都导致我国游戏行业发展缓慢,因此对游戏引 

构、内存管理、图像绘制等一些底层的技术,能够 

擎的研究意义重大. 

加快游戏开发的进度,节省开发的成本.好的引擎 

是一款游戏成功的基石.目前,我国的游戏引擎技 

1 目的 

术大大落后于其他国家.国内的大部分网络游戏 

都是代理韩国和欧美等国家的,而且价格昂贵,使 

游戏引擎是游戏、机器、用户之问进行交互通 

用不便,这导致了大批国内厂商在自主研发时困 

信的系统,一个游戏引擎一般又可分为若干子系 

收稿日期:2008—06—05 

作者简介:陈占锋(1981一),男,硕士研究生,主要从事游戏开发与多媒体技术研究 

154 重庆工学院学报 

统:图形系统、输入系统、声音系统、网络通信、脚 

本、时间系统、配置等.一款好的游戏游戏引擎常 

常需要一组优秀的开发人员几年的开发周期(像 

Unreal引擎、id的DOOM3这样的顶级引擎更是花 

3框架流程图与关键点 

游戏引擎的总体框架如图2所示. 

费了十多年的开发周期).当然本项目设计的引擎 

做不到如此的庞大复杂,我们的目标是用这款基 

于DirectX技术设计的引擎在Windows平台的 

VC6.0的环境下实现一个的飞行射击游戏,在此 

基础上对一些关键技术作了剖析…1. 

2 DirectX简介 

Direct SDK是微软开发的一套用于设计多媒 

体、2D、3D游戏程序的API,其中的相关的组件 

(c0mponent)包括l_2j:①Direct Graphics(合并了Di— 

rect3D、DircetDmw);②DirectAudio(含提供硬件和 

软件的声音混合与回放的DirectSotmd和DirectMu. 

sic,用于处理基于消息的音乐数据);③DirectIn— 

put,为包括游戏杆、鼠标、键盘和游戏控制器在内 

的输人设备提供支持;④DirectShow,关于视频播 

放的加码与解码,压缩与控制;⑤DirectPlay,通过 

调制解调器或通过网络来与应用程序相连. 

DirectX与Win32的关系结构如图1所示. 

Windows Win32应用程序 

DirectXI子系统 

GDI 

GDI DirectX 

接口 

整舍为 

Windows DDI 

设备驱动接口 

—— 

低层驱动程序 

I竺 : 

‘荐  

丝墨f

软件模拟 

 

硬件:音频、视频,输入、存储 

图1 DirectX构架与Win32的关系 

DircetX具备几个特性:与硬件无关,直接存取 

显存,支持硬件加速,具有网络连接功能.这些特 

性也使得在Windows平台下的游戏开发用DirectX 

成为最佳选择. 

]_6引 引引 ,.

一 0irno_【

图2引擎总体框架 

配置系统负责读取配置记录文件,实现修改 

设置.在游戏的初始化和运行期间,所有子系统都 

直与它保持通讯.图形系统用DirectX实现图形 

图像处理,并封装成独立的API供开发调用.I/O 

系统使游戏对键盘鼠标等设备的触发作出接收处 

理,并由主程序使其与游戏逻辑处理关联.声音系 

统负责载入播放各种声音音效.由于游戏中很多 

处理是基于时间系统的,所以时间系统独立起来. 

当然对于复杂些的引擎还应包括虚线连接的脚本 

系统和专门的AI(人工智能)系统等[3-4]. 

游戏的框架流程如图3所示. 

图3基本流程 

3.1子弹的实现【 ] 

子弹的实现可以使用STL中的vector.当按下 

开火键时发出一颗子弹,就往vector中添加一个结 

点;当子弹飞出窗口或击中敌机时,再将结点从 

vector中删除.每帧游戏画面中在子弹飞行时只需 

将vector中的所有子弹进行处理、绘画即可.参考 

代码如下: 

添加子弹: 

if(g—ctrlDo ̄na),//当ctrl按下时开火 

{ 

_

∞0 Tl u0 

陈占锋,等:基于DirectX的飞行射击游戏引擎实现要点 

m—BulletEnd=nl—Gtime一>GetTime(); 

if(m—BulletEnd—in—BulletStart)*1000 

155 

标放在POINT数组中,并将其作为参数代人Cre. 

atePolygonRgn()中生成HRGN,在子弹与主角飞机 

作碰撞检测时只需判断子弹的中心点是否在这个 

>120)//如果连续按着开火键不放,控制不会发 

出太多子弹 

Region中,使碰撞更加精确. 

3。3精灵图的实现 { 

m—BulletStart=nl—BulletEnd; 

MBUIJ,ET tmpBullet; 

游戏中的人物图和射击类游戏的飞机、爆炸 

等图像叫做精灵图.精灵图实际上是将所有帧的 

tmpBullet.pos.X=m—SP0s.x一1: 

图片放在一个文件中,游戏时靠一个RECT来控制 

tmpBullet.pos.Y=In—SP0s.Y一26; 

画图像文件中的某一部分,进而控制游戏显示哪 

tmpBullet.speed=5;//子弹飞行速度 

帧图,这时只需控制好RECT的位置即可。 

m—BulletH'st。push—back(nnpBullet);//将 

以下代码实现了精灵动画的效果_5:5_ 

子弹添加到vector中 

If m—timeEnd—in—timeStart>100) 

} { 

} 

In

lmagelD++: 

删除子弹: if(nl—lmageID—nl—beginlD>=num) 

vector<MBUI.I,ET>::iterator itei; 

{m—ImagelD=m—beginlD;} 

for(itei=in—BulletList.begin();itei!=in— m—timeStart=timeGetTime(); 

Bulle山st.end();itei++)//遍历所有子弹 

} 

{ 

int id=in—lmagelD++: 

m—Bulle山st.era8 ̄(itei);//44除这个子弹 

SetRect( 一feet,35*id,0,35*(id+ 

itei=in—BulletList.b ̄sin();//删除一个 1),35); 

结点后,为避免出错下次就从头检查 

m—pGraph一>BhBBuffer(m—pImageBuffer, 

if(m~BLdJetList.empty()) 

true,m

Pos.x,m—Pos.Y,In—feet); 

break;//若删除结点后子弹vector已空则跳出 

3.4配置文件实现敌机的飞行轨迹 

循环 

不同敌机以不同的轨迹飞行,只要把轨迹上 

} 

的几个关键点作为目标点,当到达这个目标点时, 

3.2碰撞检测【5] 

把目标列表中的下一个点作为下一个目标点,敌 

使用Windows API函数RectlnRegion: 

机继续向其飞行,这样就实现了敌机的不同轨迹 

vector<C呦>::iterator itei;//vector迭代器 

飞行.本研究用2个函数GetPrivatePm. 

for(itei=m—EnimyList.begin();itei!=nl— 

ifleSectionNames()和GetPrivateProfileString()来读取 

EnimyHst.end();itei++)//遍历所有敌机 

硬盘上的配置文件(.cfg),这样,每一架飞机的初 

{rmGNh ̄ ::CreateRectRgn(m—player一> 

始化信息可以写在.cfg文件中,通过一个循环算 

pos.x,nl—player一>pos.Y,rn—player一>pos.X+35。 

法来读取. 

m—player一>pos.y+35); 

将.cfg文件中所有的section nalne¥读取到一 

SetRect(&m—met,itej一>getPosition().x,itej一 

字符数组中,代码如下: 

>getPosition().y,itej一>getPosition().x+5O, ej一 

DW0fu)GetPrivateProfileSectionNames( 

>getPosition().Y+50) 

I_PI ̄TR lpszRetumBuffer,//存放section 

if(RectInRegion(hrg ̄,&Ⅱl—met))//两机相撞 

nanle8的字符串指针 

{//碰撞之后的各种处理} 

DWORD nSize,//字符串的长度 

} 

LPCTSTR lpFileName//fi5置文件路径 

使用Windows API函数PtInRegion()和CIe— 

); 

atePolygonRgn(),选取主角飞机的3个关键点的坐 

读取某section nalTle中的某个字段的值的代码 

156 重庆工学院学报 

如下: 

DWORD GetPrivateProfileString( 

LPCTSTR lpAppName, 

LPCTSTR lpKeyNal/le,//要找的字段名 

LPCTSTR lpDefault,//若查找失败的默认返回值 

LPTSTR lpReturnedString,//存放指定字段名 

所对应的值 

DWORD nSize,//返回值的字符串长度 

LP嗍lpFileName//在这个.c培文件中查找 

4 DirectInput实现游戏控制 

DirectInput是一个不依赖硬件的虚拟输入系 

统,它使得开发人员不必与输人设备的打交道,只 

需要由DirectInput来负责翻译转换. 

想通过DirectInput从一个输入设备获取数据, 

需要执行以下步骤: 

1)用Directlnput8Create()创建接口. 

2)为游戏中的设备在创建时用CreateDe ̄ce 

()传递一个GUID(Globally Unique Identiifers). 

3)为输入设备设置协作等级,由函数IDirect. 

InputDevice8::SetCooperativeLevel来完成. 

4)用SetDataFormat()设置设备的数据格式. 

5)用IDirectInputDevice8::SetProperty()设置设 

备性能. 

6)用lDirectlnputDevice8::Acqui ̄()获取设备. 

7)从每个设备中获取所需要的数据,通过调 

用IDirectlnputDevice8::GetDevieeState()完成. 

5添加音效 

DirectX通过DirectAudio进行音效处理,它包 

括DirectSound和DirectMusic.DirectSound是底层 

API,负责将声音流从操作系统传输到声卡硬件; 

DirectMusic是高层API,负责对不同的声音文件自 

动选择解码器,并转化为声音流.本游戏仅用Di— 

rectSound来处理wav文件.使用DirectSound编制程 

序分为4个步骤: 

1)为声音获得一个全局唯一标志符(GUID); 

2)生成DirectSound对象; 

3)设置协作优先等级; 

4)设置主缓冲器对象的格式. 

在根据上述步骤完成对DirectSound的初始化 

工作后,还要建立一个创建次缓冲区的函数,用数 

据填充其中,并把信息存储起来,同时返回声音 

ID.只需要把文件名和标准DireetSotmd控制标志 

传递给它,就能做到随时播放任意音乐的效果了. 

6结束语 

在Windows平台下运行游戏.图4为游戏中的 

画面. 

图4游戏截屏 

这个游戏引擎满足了一个简单完整的飞行射 

击游戏的需求.游戏开发包含了碰撞检测、怪物的 

产生及移动、关卡与计分、简单人工智能、场景控 

制、游戏音效等几个重点技术,实现了预期的目 

标.这个构架可重用性和可扩展性较高,可在这个 

构架基础上添加游戏关卡复杂度,完成一个效果 

更吸引人的射击游戏. 

参考文献: 

[1]叶思义,宋昀潞.游戏设计全方位学习[M].北京:中 

国铁道出版社,2006. 

[2]Andre L.WINDOWS游戏编程大师技巧[M].沙鹰, 

译.北京:中国电力出版社,2OO4. 

[3]Andrew R,Dave M.游戏架构与设计[M].付煜,庄晓 

雷,译.北京:希望电子出版社,2005. 

[4]金禾3-作室.3D游戏程序设计基础[M].北京:希望 

电子出版社.2006. 

[5]严朝军,周其力,张宁.游戏中的程序设计技术[J]. 

电脑开发与应用,20OO,13(5):37—39. 

(责任编辑刘舸) 


发布者:admin,转转请注明出处:http://www.yc00.com/web/1710613570a1787026.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信