实训报告飞机大战游戏设计与开发姓名:陆再旺专业名称:___数字媒体技术___________班级:______2011级__________________学号:___201101051114____________信息科学与工程学院二零一三年十二月信息科学与工程学院软件实践实训报告2目录1.项目概述······················································错误!未定义书签。2.相关技术······················································错误!未定义书签。2.1透明贴图技术··················································错误!未定义书签。2.2CObList技术···················································错误!未定义书签。2.3获取矩形区域函数············································错误!未定义书签。2.4键盘控制战机位置函数······································错误!未定义书签。2.5设置定时器············································································42.6双缓冲技术············································································42.7内存释放技术·········································································43.总体设计与详细设计······························································53.1规则子系统············································································53.2游戏对象子系统······································································53.3系统模块划分········································································63.4主要功能模块·········································································74.编码实现·············································································75.实训中遇到的主要问题及解决方法···········································116.实训体会············································································14信息科学与工程学院软件实践实训报告31.项目概述此次实训主要是做一个飞机大战的游戏,其需要实现的功能为:实现游戏对象的爆炸特效,文字提示功能和界面背景特效,遵循游戏规则进行游戏;。游戏中的重要角色可分为如下几个部分:战机,敌机,战机的导弹,敌机的子弹,游戏规则为:玩家通过键盘控制用一个战机去击毁从上下两端进入的尽可能多的敌机从而获得分数。敌机数量随机,进入画面对战机进行攻击,两者或战机导弹与敌机相遇是发生爆炸,战机生命结束即游戏结束。2.相关技术2.1透明贴图函数函数原型:LoadImage(CImageList&imageList,UNITbmpID,COLORcrMask,intcx,intcy,intnInitial)//此函数主要就是用于将图片放入图像链表imageList中。(以画敌机为例)CGameObject::LoadImage(m_Images,IDB_Enemy,RGB(0,0,0),ENEMY_HEIGHT,ENEMY_HEIGHT,0);m_Images.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);//此函数主要就是将m_Images链表中的图像显示在pDC这个句柄中。ILD_TRANSPARENT表示是透明贴图。它是相同大小图像的一个集合,每个集合中均以图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。可用WINDOWS32位应用程序接口函数API来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像等操作。2.2CObList链表函数原型:CobListm_ObjListball;//主要就是定义一个CObList类的一个链表对象用于存储所有的与此种相关的对象,易于后续的添加删除和提取数据。(以画敌机为例)CObListlistEnemy;POSITIONpos=listEnemy.GetHeadPosition();pos!=NULL;//读取头指针CEnemy*pEnemy=(CEnemy*)listEnemy.GetNext(pos);//GetNext获取循环遍历中的下一个元素2.3获取矩形区域函数CRectrect;//定义GetClientRect(&rect);//获取其矩形区域rect.IntersectRect(pEnemy-GetRect(),plane.GetRect());//判断两个矩形是否有交接信息科学与工程学院软件实践实训报告42.4键盘控制战机位置函数//用于键盘控制其位置OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)if(nChar==VK_LEFT)plane.SetHorMotion(-1);elseif(nChar==VK_RIGHT)plane.SetHorMotion(1);elseif(nChar==VK_UP)plane.SetVerMotion(-1);elseif(nChar==VK_DOWN)plane.SetVerMotion(1);OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags)if(nChar==VK_LEFT)plane.SetHorMotion(0);elseif(nChar==VK_RIGHT)plane.SetHorMotion(0);elseif(nChar==VK_UP)plane.SetVerMotion(0);elseif(nChar==VK_DOWN)plane.SetVerMotion(0);2.5设置定时器SetTimer(1,20,NULL);//设置每20毫秒刷新一次定时器告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性出发程序。通常由两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。2.6双缓冲技术双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲的虚拟的区域,然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。CDCdc;//定义新的设置上下文对象,下一步绘图就在这里CBitmapbitmap;//定义新的位置,实际是一块缓冲区dc.CreateCompatibleDC(NULL);//创建新的DCbitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建与当前设备匹配的位图,分配缓冲区空间CBitmap*pOldBit=dc.SelectObject(&bitmap);………………pDC-BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);//调用原系统DC的BitBlt方法,将新缓冲区的内容以SRCCOPY(原拷贝)模式复制给原系统DC,此时,图形将出现在屏幕上bitmap.DeleteObject();//删除位图,释放空间dc.DeleteDC();//删除dc,释放空间ReleaseDC(pDC);信息科学与工程学院软件实践实训报告52.7内存释放技术此项目中有太多的对象生成和运用,造成了内存的极度紧张,但游戏进行到一定的程度的时候就会出现内存溢出现象。解决此问题的技术就是内存释放。例:(以敌机为例)pDC-listEnemy.RemoveAt(lastpos);//用于删除指针deletepDC;//删除对象3.总体设计与详细设计有三个主要的部分组成,分别是规则子系统、游戏对象子系统。系统的总体结构图如下:subsystem规则子系统subsystem游戏对象子系统3.1规则子系统该子系统主要是实现飞机大战各项游戏规则。实现了需求中的游戏规则。组成结构如下图所示:人工智能规则子系统这个系统包含1个重要的模块,人工智能,它实现了敌机对战机的攻击以及游戏对象碰撞监测规则,其实实现的是代表计算机方玉玩家进行对战。攻击规则敌机在战机上方或下方时发射炸弹,炸弹从下至上或从上至下射向战机攻击时发出声音碰撞规则导弹或炸弹本身的矩形区域和敌机或战机的矩形区域相交时,表示导弹或炸弹射中了战机或敌机战机被炸毁,游戏结束。敌机被炸毁,战机10分,出现文字提示。爆炸时产生声音信息科学与工程学院软件实践实训报告63.2游戏对象子系统该子系统包含了各个游戏对象的实现,它实现了需求中的部分规则以及游戏特效。本子系统的组织结构图如下:应用程序对象游戏对象游戏对象子系统本子系统的组织结构图如下:应用程序对象游戏对象游戏对象子系统应用程序对象游戏程序的加载游戏对象的绘制游戏规则的调用玩家的键盘事件获取游戏对象敌机图像加载敌机贴图位置存储3.3系统模块划分游戏规则子系统模块名称功能简述人工智能人机对战规则的实现游戏子系统模块名称功能简述应用程序对象游戏对象的绘制、游戏规则的调用、玩家的键盘事件获取游戏对象各个游戏对象的抽象父类战机对象战机类信息科学与工程学院软件实践实训报告7敌机对象敌机类导弹对象导弹类炸弹对象炸弹类爆炸对象爆炸类文字对象文字类3.4主要功能模块主要功能模块主要就是那些类的功能模块,主要有:1.各个游戏对象的贴图模块2.敌机数量、方向、速度、及子弹的数量、方向、和速度控制模块3.战机的导弹数目,方向和速度控制模块4.战机的键盘控制5.敌机、子弹、和战机、导弹的碰撞检测及爆炸模块6.背景添加模块7.游戏得分和生命值及游戏结束控制4.编码实现4.1创建各种游戏对象类(以敌机对象为例):文件名:Enemy.h#pragmaonce#includestdlib.h#includegameobject.h#includeresource.hclassCEnemy:publicCGameObject{public:CEnemy(void);~CEnemy(void);BOOLDraw(CDC*pDC,BOOLbPause);staticBOOLLoadImage();CRectGetRect(){returnCRect(m_ptPos,CPoint(m_ptPos.x+ENEMY_HEIGHT,m_ptPos.y+ENEMY_HEIGHT));}intGetMontion()const{returnm_nMotion;}//是否可以开火发射子弹BOOLFired();private:staticconstintENEMY_HEIGHT=35;staticCImageListm_Images;信息科学与工程学院软件实践实训报告8i