实训报告飞机大战游戏设计与开发目录1. 概述 (4)2. 相关技术 (4)2.1 透明贴图技术 (4)2.2 CObList链表 (4)2.3获取矩形区域函数 (4)2.4弹出对话框函数 (5)2.5字体的个性化输出函数 (5)2.6设置定时器 (5)2.7双缓冲技术 (5)2.8 内存释放技术 (6)2.9对话框中添加动态按钮 (6)2.10检测方向键按下 (6)3. 需求分析(用结构化方法或面向对象方法给出系统的主要需求模型) (6)3.1功能需求分析 (6)3.2 数据需求分析 (7)3.3 行为需求分析 (7)3.4 其他需求 (8)4. 总体设计与详细设计 (8)4.1 系统模块划分 (9)4.2 主要功能模块 (10)4.3 扩展功能设计思路 (10)5. 编码实现 (11)5.1游戏初始创建 (11)5.2定时器 (11)5.3背景及游戏开始、结束界面绘制函数 (11)5.4键盘控制函数 (12)5.5游戏对象进行碰撞测试和碰撞销毁 (13)5.6创建动态按钮(开始游戏、游戏规则) (13)5.6重新开始游戏代码 (14)5.7设置游戏难度代码 (14)5.8游戏结束时释放资源函数 (15)5.9调整对话框大小函数 (15)5.10开始界面背景绘制函数 (15)5.11选择下一关卡以及选择完成后的执行代码 (16)6.测试情况说明。
(17)6.1主要模块测试情况(白盒) (17)6.11各游戏对象碰撞检测爆炸模块测试 (17)6.12战机导弹的方向速度模块测试 (17)6.13文字显示,游戏结束和关卡进入模块测试 (18)6.14设置游戏难度和重新开始模块测试 (18)6.2 主要功能测试情况(黑盒) (18)6.21各游戏对象碰撞检测爆炸模块测试 (18)6.22敌机子弹导弹的方向速度模块测试 (19)6.23文字显示,游戏结束和关卡进入模块测试 (19)6.24设置游戏难度和重新开始模块测试 (19)7. 实训中遇到的主要问题及解决方法 (19)8. 实训收获与体会 (20)1. 概述本次实训主要是做一个基于windows的飞机大战单机版游戏,其实现的主要功能为:控制战机对象的移动,敌机对象的随机出现和发射子弹,实现游戏对象的爆炸特效,文字提示功能和界面背景切换特效,其主要是遵循开发者规定的游戏规则进行游戏闯关。
游戏主要角色:战机、敌机、战机导弹、敌机子弹、客机、导弹架、生命包,其中战机分为四种:普通战机,一级战机,二级战机。
其主要遵循的游戏规格如下:战机数量为1;由玩家通过键盘控制(方向键控制位置、‘Z’键发射导弹)战机,战机有一定的运行速度;导弹释放存在间隔,有一定的运行速度;导弹遇到敌机发生爆炸,敌机被炸毁,导弹消失,玩家得分;由计算机控制敌机自动向战机发动攻击;敌机数量随机,计算机生成敌机时随机选择类别;普通敌机从游戏区域的上下两端进入位置随机;敌机行驶期间,不左右移动,不反向移动;运行线路为直线,方向为从下至上,或从下至上,不可左右移动;战机导弹击毁敌机后有一定几率掉落导弹架和生命包,导弹架可以增加战机导弹数量,生命包可以增加战机生命。
每关有boss从游戏区域的左上角端进入,左右位置随机;敌机行驶期间,可左右移动,可反向移动;当敌机到达战机下方时发射炸弹对战机进行攻击。
炸弹纵向由发射位置起至游戏区域结束;炸弹遇到战机时发生爆炸,战机减生命值,炸弹消失;战机与boss碰撞,战机被毁,游戏结束;炸弹运行时有速度限制;客机在游戏界面左上角出现,又左向右运动,客机上有油箱,导弹击中客机油箱客机爆炸并消失,玩家减分。
当玩家战机生命值为0时,游戏结束,并显示玩家得分。
2. 相关技术此次实训的飞机大战游戏其中的技术主要就是一些API函数、内存释放和双缓冲技术。
2.1 透明贴图技术此次实训中用于贴图的函数:LoadImage(CImageList& imageList,UINT bmpID,COLORREF crMask,int cx,int cy,int nInitial) //此函数主要用于将图片放入图像链表imageList中。
img_Bomb1.Draw(pDC,0,G_pos,ILD_TRANSPARENT) //此函数主要是讲img_Bomb1链表中的图像显示在pDC这个句柄中。
ILD_TRANSPARENT表示是透明贴图。
其中主要就是CImageList图像列表。
它是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。
可以利用WINDOWS32位应用程序接口函数API来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像等操作。
2.2 CObList链表CObList bomblist; //主要是定义一个CObList类的一个链表对象用于存储所有的此种相关的对象,易于后续的添加删除和提取数据。
POSITION posball=NULL,posball_t=NULL; //定义指针CBomb *temp = new CBomb();temp=pDoc->bomblist.GetHeadPosition();//指针读取头结点temp= (CBomb *)pDoc->bomblist.GetNext(posball); //指针读取下一个结点2.3获取矩形区域函数CRect rc; //定义GetClientRect(&rc); //获取其矩形区域获取结果课为:rc.Width() //矩形区域的宽度rc.Height() //矩形区域的高度CRect tmpRect;tmpRect.IntersectRect(&bRect,eRect))//判断两个矩形是否有交接2.4弹出对话框函数if(AfxMessageBox(L"是否进入下一关?",MB_YESNO)==6){}//此函数主要是弹出对话框供用户进行选择,当用户点击确定按钮时执行此函数的{}内的语句进行继续运行。
2.5字体的个性化输出函数MemDC.SetBkMode(TRANSPARENT);MemDC.SetTextColor(RGB(0, 0, 0));CFont font;//创建一个字体对象;LOGFONT lf;memset(&lf, 0, sizeof(LOGFONT));lf.lfHeight = 40;lf.lfWidth = 20;//设置字的高度和宽度;font.CreateFontIndirect(&lf);// HFONT CreateFontIndirect(CONST LOGFONT *lplf);MemDC.SelectObject(font);char strData[100];sprintf_s(strData, 20, "得分:%d", pDoc->score);MemDC.TextOut(260, 350, (CString)strData);//在对话框中显示strData里的字;2.6设置定时器定时器告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。
通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
SetTimer(1,30,NULL); //设置每30毫秒刷新一次2.7双缓冲技术关于双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲得虚拟的区域,然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。
CDC MemDC; //首先定义一个显示设备对象CBitmap MemBitmap;//定义一个位图对象//随后建立与屏幕显示兼容的内存显示设备MemDC.CreateCompatibleDC(NULL);//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);//将位图选入到内存显示设备中CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);//先用背景色将位图清除干净MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));//绘图MemDC.MoveTo(……);MemDC.LineTo(……);//将内存中的图拷贝到屏幕上进行显示pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//绘图完成后的清理MemBitmap.DeleteObject();MemDC.DeleteDC();2.8 内存释放技术在此次实训项目中有太多的对象的生成和运用,造成了内存的极度的紧张,当游戏进行到一定的程度的时候就会出现内存溢出现象。
解决此问题的技术就是内存释放。
内存释放技术的实现主要是通过释放各个满足一定条件的对象和链表来实现的,pDoc->bomblist.RemoveAt(mPos2);//用于删除指针delete pDoc->Bomb;//用于删除对象2.9对话框中添加动态按钮ID号是控件的标识,创建控件前必须先为它设置一个ID号。
打开资源中的“String Table”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在其中的ID编辑框中输入ID,如:IDC_MYBUTTON,在Caption中输入控件标题或注解然后用CButton *p_MyBut = new CButton();创建一个CButton类的普通按钮。
再然后在CSpaceWarView中添加响应函数,在头文件中添加函数定义,编写消息响应函数,最后回收资源2.10检测方向键按下使用SHORT GetKeyState(int nVirtKey)函数检测方向键是否按下。
该函数检取指定虚拟键的状态。
该状态指定此键是UP状态,DOWN状态,还是被触发的(开关每次按下此键时进行切换)。
3. 需求分析(用结构化方法或面向对象方法给出系统的主要需求模型)3.1功能需求分析1、战机数量为1,战机的位置可通过键盘(方向键和游戏常用键均可进行控制战机的位置)。
可通过‘Z’键控制战机进行发导弹,战机导弹有一定的数量限制,发射完固定数量的导弹后便不能在发射导弹,导弹具有一定的速度。
2、敌机出现的时间和位置均为随机,敌机的速度,敌机发射子弹的时间可以再难度设置更改,子弹的发射具有延时性,子弹的速度具有随机性。
3、导弹和子弹及敌机碰撞爆炸同时销毁碰撞的物体,战机和子弹及敌机碰撞爆炸同时销毁碰撞的子弹及敌机,战机则判断生命,为0时游戏结束否则继续。