1、C+实训报告实 训 报 告飞机大战游戏设计与开发姓名* 专业名称: 数学专业班 级: * 学 号: *信息科学与工程学院二零一三年十一月目 录1.概述22. 相关技术 22.1获取矩形区域函数22.2添加爆炸效果函数22.3弹出对话框函数32.4字体的个性化输出函数42.5键盘控制战机位置和发射子弹的函数42.6设置定时器42.7双缓冲技术52.8内存释放技术53.需求分析53.1功能需求分析53.2 数据需求分析63.3 行为需求分析64. 总体设计与详细设计 64.1系统模块划分84.2主要功能模块84.3扩展功能设计思路95. 编码实现 9 6. 测试情况说明 246.1主要模块测试情况
2、(白盒) 246.2 主要功能测试情况(黑盒)247. 实训中遇到的主要问题及解决方法 258. 实训体会 25 1. 概述飞机大战游戏是基于Windows桌面的射击类游戏。做为一个游戏首先要保证游戏本身的规则,而这个版本的一个重要的功能就是其2D的展现形式。飞机大战游戏作为PC中一款桌面游戏,界面简洁流畅、游戏方式简单,玩起来易于上手。其实现的功能为:实现游戏对象的爆炸特效、声音特效、文字提示功能和界面背景,其主要是遵循一定的游戏规则进行游戏。游戏中的主要角色可分为如下几个基本部分:战机、敌机、战机的导弹、敌机的子弹。其主要遵循的游戏规则为:战机数量为1;由玩家通过键盘控制(方向键控制位置、
3、空格键发射导弹)战机;导弹释放存在间隔,有一定的运行速度;导弹遇到敌机发生爆炸,敌机被炸毁,玩家得分;由计算机控制敌机自动向战机发动攻击;敌机数量随机,计算机生成敌机时随机选择位置;敌机从游戏区域的上下两端进入;敌机行驶期间,不左右移动,不反向移动;敌机发射炸弹对战机进行攻击,运行线路为直线,方向为从下至上,或从下至上,不可左右移动,敌机炸弹击中战机,战机生命值减1。该游戏有关卡,战机生命值减为0,游戏结束,选择是否重新开始;战机仍有生命值时,并且得到要求的分数可进入下一关。2. 相关技术此次实训的飞机大战游戏其中的技术主要就是一些函数(获取矩形区域函数、添加爆炸效果函数、弹出对话框函数、字体
4、的个性化输出函数、键盘控制战机位置和发射子弹的函数)、设置定时器、内存释放和双缓冲技术。2.1获取矩形区域函数 CRect CBomb:getRect(void) return CRect(CPoint(Pos.x,Pos.y),CPoint(Pos.x+55,Pos.y+20);CRect bombRect = bomb-getRect();CRect CEnemy:getRect(void) return CRect(CPoint(Pos.x,Pos.y),CPoint(Pos.x+35,Pos.y+35);CRect enemyRect = enemy-getRect();CRect t
5、empRect;tempRect.IntersectRect(&bombRect,enemyRect)/判断两个矩形是否有交接2.2添加爆炸效果函数PlaySound(LPCTSTR)IDR_WAVE2,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC);/此函数用于将ID为IDR_WAVE1的音频在执行此语句时进行播放。2.3弹出对话框函数if(AfxMessageBox(LGAME OVER!重新开始?,MB_YESNO)=1) /清空敌机链表 ListEnemy1.RemoveAll(); ListEnemy2.RemoveAll(); /清空敌
6、机炸弹链表 ListBall1.RemoveAll(); ListBall2.RemoveAll(); /清空战机子弹链表 ListBomb1.RemoveAll(); ListBomb2.RemoveAll(); /清空爆炸链表 ListExplosion.RemoveAll(); /添加新的战机对象 /*myplane = new CMyPlane;*/ myscore=0; lifeNum = 20; SetTimer(1,100,NULL); /if else exit(1);/此函数主要是弹出对话框供用户进行选择,当用户点击确定按钮时执行此函数的内的语句进行继续运行。2.4字体的个性
7、化输出函数HFONT font; font=CreateFont(20,10,0,0,0,0,0,0,0,0,0,100,10,0); MemDC.SelectObject(font); CString str; MemDC.SetTextColor(RGB(239,7,7); MemDC.SetBkColor(RGB(0,0,0); str.Format(_T(游戏得分:%d),myscore); MemDC.TextOut(10,10,str); str.Format(_T(剩余生命:%d),lifeNum); MemDC.TextOut(10,30,str); str.Format(_T
8、(当前关卡:%d),passnum); MemDC.TextOut(10,50,str);2.5键盘控制战机位置和发射子弹的函数if (GetKeyState(VK_LEFT)rect.left) myplane.move(1); if (GetKeyState(VK_RIGHT)0) if(myplane.Pos.xrect.right-50) myplane.move(2); if (GetKeyState(VK_UP)rect.top) myplane.move(3); if (GetKeyState(VK_DOWN)0) if(myplane.Pos.yrect.bottom-50)
9、myplane.move(4); if (GetKeyState(VK_SPACE)SetTimer(1,100,0); /设置每100毫秒刷新一次2.7双缓冲技术关于双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲得虚拟的区域,然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。/定义一个位图对象 CBitmap MemBitmap; CDC MemDC; /这时还不能绘图,因为没有位图的设备描述表是不能绘图的 /只有选入了位图的设备描述表才有地方绘图,画到指定的位图上 MemDC.CreateCompatibleDC(pDC); /下面建立一个与屏幕设备描述表(或者
10、内存设备描述表)兼容的位图 MemBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom); CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); /将位图选入到内存设备描述表 MemDC.StretchBlt(0,0,rect.Width(),rect.Height(),&cdc_BackGround,0,0,bimap2.bmWidth,bimap2.bmHeight,SRCCOPY); /绘图完成后的清理pDC-BitBlt(rect.left,rect.top,rect.right,r
11、ect.bottom,&MemDC,0,0,SRCCOPY); MemBitmap.DeleteObject(); MemDC.DeleteDC();2.8 内存释放技术在此次实训项目中有太多的对象的生成和运用,造成了内存的极度的紧张,当游戏进行到一定的程度的时候就会出现内存溢出现象。解决此问题的技术就是内存释放。内存释放技术的实现主要是通过释放各个满足一定条件的对象和链表来实现的,/爆炸后删除子弹 ListBomb1.RemoveAt(bombTemp); delete bomb; /删除敌机 ListEnemy1.RemoveAt(enemyTemp); delete enemy; 3.
12、需求分析3.1功能需求分析游戏基本规则飞机对战规则游戏特效界面背景特效游戏对象特效声音特效文字提示3.2数据需求分析 战机数量为1,敌机数量随机随机产生,当战机被击中时生命值减1,战机与敌机相撞生命值减1,战机击中敌机分数加1,战机生命值减到0时,游戏结束,生命值大于0并且分数到达一定要求时进入下一关。上方敌机、下方敌机、上方敌机的炸弹、下方敌机的炸弹、战机的两排导弹均以链表存储。当战机与敌机相撞时敌机从该链表删除,导弹击中敌机时,敌机从该链表删除,导弹从该链表删除。3.3行为需求分析战机上下移动,通过鼠标或键盘控制位置,空格键发射导弹;敌机出现位置随机,从上方出现,或从下方出现,发射子弹攻击
13、战机,敌机可以与战机相撞。当战机生命值为0时,提示游戏结束是否进入下一关,当分数值到达一定要求时提示恭喜过关是否进入下一关。4. 总体设计与详细设计总体设计主要课将其分为两大部分:规则子系统,游戏对象子系统。系统的总体结构图如下: 规则子系统主要是实现飞机大战各项游戏规则。实现需求中的游戏规则,组成结构图如下:主要是实现敌机战机的攻击和反攻的游戏规则等来实现计算机方和玩家进行对战。1、主要的攻击规则如下:1)、敌机可在战机的上方或者下方进行将子弹进行射向战机,同时战机也可根据玩家的指示进行向上或者向下进行发射导弹进行反攻。2)、攻击时发出声音。2、主要的碰撞规则如下:1)、导弹或者子弹本身的矩
14、形区域和敌机或者战机的矩形区域相交时,表示其相互发生碰撞表示其相互爆炸。根据实战规则销毁游戏对象。2)、战机生命为0,战机被炸,战机被销毁,游戏结束。3)、敌机或者子弹被炸毁,将其进行销毁同时进行分数的相应的增加,并且出现文字提示。4)、爆炸时发出声音。3、主要时间控制规则如下: 1)、当游戏的持续时间超过特定的时间,游戏结束,出现文字提示。 2)、当游戏的关卡改变时进行游戏持续时间的一个相应的改变。游戏对象子系统主要包括:应用程序对象和游戏对象4、应用程序对象:1)、游戏程序的加载2)、游戏对象的绘制3)、游戏规则的调用4)、玩家键盘鼠标事件的获取5、游戏对象: 1)、各游戏对象的图像加载
15、2)、各游戏对象的贴图 3)、各游戏对象的位置存储类图如下:4.1 系统模块划分模块名称功能简述应用程序对象游戏程序的加载、游戏对象的绘制、游戏规则的调用、玩家的键盘事件获取游戏对象各个游戏对象的抽象父类战机对象战机类敌机对象敌机类导弹对象导弹类炸弹对象炸弹类爆炸对象爆炸类4.2 主要功能模块主要功能模块主要就是那些类的功能模块,主要有: 1、各个游戏对象的贴图模块2、敌机数量、方向、速度以及子弹的数量、方向和速度控制模块。3、战机的导弹的数目、方向和速度控制模块。4、战机的键盘控制和鼠标控制位置模块。5、敌机、子弹和战机、导弹的碰撞检测以及爆炸模块。6、背景添加模块。7、战机速度控制模块。8
16、、游戏关卡游戏难易度设置和游戏关卡选择。9、游戏得分和生命值控制以及游戏关卡进入控制和游戏结束。10、游戏重新开始和游戏暂停控制模块。11、游戏音效控制模块。4.3 扩展功能设计思路本次实训由于时间问题还有些扩展功能可进行增加,主要有: 1给游戏增加敌机类型,丰富画面,增加难度2、给游戏进行增加boss,通过boss的添加进行游戏的关卡和难度的更加进一步的提升。主要思路是:再增加一个类让它继承敌机类,然后再敌机类的基础上进行增加其生命值和被打死后的得分。当战机得分到达一定的值以后boss出现并进行和敌机一个队伍发射另类的子弹进行攻击战机。 5. 编码实现void CPLANEGAMEView:
17、OnDraw(CDC* pDC) CPLANEGAMEDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; /加载图片背景 this-GetClientRect(&rect); CBitmap bitmap_BackGround; bitmap_BackGround.LoadBitmap(IDB_BACKGROUND); BITMAP bimap2;/位图图像 bitmap_BackGround.GetBitmap(&bimap2); CDC cdc_BackGround;/定义一个兼容的DC cdc_BackGro
18、und.CreateCompatibleDC(pDC);/创建DC CBitmap*Old=cdc_BackGround.SelectObject(&bitmap_BackGround); /定义一个位图对象 CBitmap MemBitmap; /双缓冲技术 CDC MemDC; /这时还不能绘图,因为没有位图的设备描述表是不能绘图的 /只有选入了位图的设备描述表才有地方绘图,画到指定的位图上 MemDC.CreateCompatibleDC(pDC); /下面建立一个与屏幕设备描述表(或者内存设备描述表)兼容的位图 MemBitmap.CreateCompatibleBitmap(pDC,
19、rect.right,rect.bottom); CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); /将位图选入到内存设备描述表 MemDC.StretchBlt(0,0,rect.Width(),rect.Height(),&cdc_BackGround,0,0,bimap2.bmWidth,bimap2.bmHeight,SRCCOPY); /绘图完成后的清理 /画飞机 myplane.draw(&MemDC); /画向下飞的敌机 CEnemy* enemy1; POSITION pos1; for(pos1=ListEnemy1.GetHe
20、adPosition();pos1!=NULL;) enemy1=(CEnemy*)ListEnemy1.GetNext(pos1); enemy1-draw(&MemDC); /画向下飞的敌机的子弹 CBall* ball1; POSITION posball1; for (posball1=ListBall1.GetHeadPosition();posball1!=NULL;) ball1=(CBall*)ListBall1.GetNext(posball1); ball1-draw(&MemDC); /画向上飞的敌机 CEnemy* enemy2; POSITION pos2; for(
21、pos2=ListEnemy2.GetHeadPosition();pos2!=NULL;) enemy2=(CEnemy*)ListEnemy2.GetNext(pos2); enemy2-draw(&MemDC); /画向上飞的敌机的子弹 CBall* ball2; POSITION posball2; for (posball2=ListBall2.GetHeadPosition();posball2!=NULL;) ball2=(CBall*)ListBall2.GetNext(posball2); ball2-draw(&MemDC); /画战机的炮弹 CBomb* bomb1;/第
22、一排战机炮弹 POSITION POS1; for(POS1=ListBomb1.GetHeadPosition();POS1!=NULL;) bomb1=(CBomb*)ListBomb1.GetNext(POS1); bomb1-draw(&MemDC); CBomb* bomb2;/第二排战机炮弹 POSITION POS2; for(POS2=ListBomb2.GetHeadPosition();POS2!=NULL;) bomb2=(CBomb*)ListBomb2.GetNext(POS2); bomb2-draw(&MemDC); /画爆炸 CExplosion* explos
23、ion; POSITION explosionPos1,explosionPos2; for(explosionPos1 = ListExplosion.GetHeadPosition();explosionPos1!=NULL;) explosionPos2=explosionPos1; explosion = (CExplosion *) ListExplosion.GetNext(explosionPos1); if(explosion-draw(&MemDC)=0) ListExplosion.RemoveAt(explosionPos2); /输出当前信息 HFONT font; f
24、ont=CreateFont(20,10,0,0,0,0,0,0,0,0,0,100,10,0); MemDC.SelectObject(font); CString str; MemDC.SetTextColor(RGB(239,7,7); MemDC.SetBkColor(RGB(0,0,0); str.Format(_T(游戏得分:%d),myscore); MemDC.TextOut(10,10,str); str.Format(_T(剩余生命:%d),lifeNum); MemDC.TextOut(10,30,str); str.Format(_T(当前关卡:%d),passnum)
25、; MemDC.TextOut(10,50,str); pDC-BitBlt(rect.left,rect.top,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY); MemBitmap.DeleteObject(); MemDC.DeleteDC(); / TODO: 在此处为本机数据添加绘制代码 void CPLANEGAMEView:OnInitialUpdate() if(AfxMessageBox(L查看游戏说明请点击“是”,若直接进入游戏请点击“否”!,MB_YESNO)=6) AfxMessageBox(L方向键控制战机方向,空格键射击,鼠标均
26、可控制。初始生命值为,消灭一个敌机加分,分数达到即可进入下一关。随着关卡增多,敌机速度增加!); Sleep(1000); CView:OnInitialUpdate(); /加载飞机 myplane.load(); GetClientRect(&rect); myplane.setPoint(rect.right/2,rect.bottom/2); /加载敌机 CEnemy:load(); /加载飞机炮弹 CBomb:load(); /加载战机子弹 CBall:load(); /加载爆炸 CExplosion:load(); /设置定时器 this-SetTimer(1,100,0); / TODO: 在此添加专用代码和/或调用基类 void CPLANEGAMEView:OnTimer(UINT_PTR nIDEvent) / TODO: 在此添加消息处理程序代码和/或调用默认值 /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1