c++实训报告(飞机大战)_第1页
c++实训报告(飞机大战)_第2页
c++实训报告(飞机大战)_第3页
c++实训报告(飞机大战)_第4页
c++实训报告(飞机大战)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息科学与工程学院软件实践实训报告PAGEPAGE16实训报告飞机大战游戏设计与开发专业名称:软件工程11-2学号:201101051723姓名:王佳贺信息科学与工程学院二零一三年十一月目录1.概述【一级标题,黑体,四号,加粗,顶头】 42.相关技术 42.1透明贴图函数(技术一的名称) 42.2CObList链表(技术二的名称) 42.3获取矩形区域函数 52.4添加爆炸效果函数 52.5弹出对话框函数 52.6字体的个性化输出函数 52.7鼠标键盘控制战机位置的函数 62.8延迟函数 62.9设置定时器 62.10双缓冲技术 62.11内存释放技术 63.总体设计与详细设计 73.1系统模块划分 83.2主要功能模块 93.3扩展功能设计思路 94.编码实现 94.1游戏初始创建 104.2定时器 104.3背景设定 104.4键盘控制函数 114.5文字显示函数 114.6游戏对象进行碰撞测试和碰撞销毁,文字提示函数 124.7选择下一关卡以及选择完成后的执行代码 134.8游戏结束代码 144.9鼠标控制战机代码 144.10重新开始游戏代码 155.实训中遇到的主要问题及解决方法 156.实训体会 161.概述【一级标题,黑体,四号,加粗,顶头】(介绍所做的项目,要实现的主要功能)【正文,五号,宋体,首行缩进2字符】此次实训主要是要做一个飞机大战的游戏,其需要实现的功能为:实现游戏对象的爆炸特效、声音特效、文字提示功能和界面背景特效,其主要是遵循一定的游戏规则进行游戏。游戏中的主要角色可分为如下几个基本部分:战机、敌机、战机的导弹、敌机的子弹。其主要遵循的游戏规则为:战机数量为1;由玩家通过键盘控制(方向键控制位置、CTRL键发射导弹)战机;导弹释放存在间隔,有一定的运行速度;导弹遇到敌机发生爆炸,敌机被炸毁,导弹消失,玩家得分;由计算机控制敌机自动向战机发动攻击;敌机数量随机,计算机生成敌机时随机选择类别;敌机从游戏区域的上下两端进入,左右位置随机;敌机行驶期间,不左右移动,不反向移动;当敌机到达战机下方时发射炸弹对战机进行攻击;运行线路为直线,方向为从下至上,或从下至上,不可左右移动。纵向由发射位置起至游戏区域结束;炸弹遇到战机时发生爆炸,战机被炸毁,炸弹消失,游戏结束;炸弹运行时有速度限制。2.相关技术此次实训的飞机大战游戏其中的技术主要就是一些函数、内存释放和双缓冲技术。2.1透明贴图函数(技术一的名称)此次实训中用于贴图的函数:LoadImage(CImageList&imageList,UINTbmpID,COLORREFcrMask,intcx,intcy,intnInitial)//此函数主要用于将图片放入图像链表imageList中。img_Bomb.Draw(pDC,0,m_m_ptPos,ILD_TRANSPARENT)//此函数主要是讲img_Bomb1链表中的图像显示在pDC这个句柄中。ILD_TRANSPARENT表示是透明贴图。其中主要就是CImageList图像列表。它是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。可以利用WINDOWS32位应用程序接口函数API来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像等操作。2.2CObList链表(技术二的名称)CObListm_ObjListball;//主要是定义一个CObList类的一个链表对象用于存储所有的此种相关的对象,易于后续的添加删除和提取数据。POSITIONposball=NULL,posball_t=NULL;//定义指针posball=pDoc->m_ObjListball.GetHeadPosition();//指针读取头结点pDoc->pball=(Cball*)pDoc->m_ObjListball.GetNext(posball);//指针读取下一个结点2.3获取矩形区域函数 CRectrc;//定义GetClientRect(&rc);//获取其矩形区域获取结果课为:rc.Width()//矩形区域的宽度rc.Height()//矩形区域的高度CRecttmpRect;tmpRect.IntersectRect(&bRect,eRect))//判断两个矩形是否有交接2.4添加爆炸效果函数PlaySound((LPCTSTR)IDR_WAVE1,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC);//此函数用于将ID为IDR_WAVE1的音频在执行此语句时进行播放。2.5弹出对话框函数if(AfxMessageBox(L"是否进入下一关?",MB_YESNO)==6){}//此函数主要是弹出对话框供用户进行选择,当用户点击确定按钮时执行此函数的{}内的语句进行继续运行。2.6字体的个性化输出函数CStrings; dcMem.SetTextColor(RGB(255,0,0)); dcMem.SetBkMode(TRANSPARENT); hFont=CreateFont(50,20,0,0,100,0,0,0,0,0,0,100,10,0); /*CreateFont(字体高度,字体宽度,字体显示角度,字体的角度,字体的磅值,斜体字体, 带下划线的字体,带删除线的字体,所需的字符集,输出的精度,裁剪的精度,逻辑字体与 输出设备的实际,字体之间的精度,字体间距和字体集,字体名称*/dcMem.SelectObject(hFont); s.Format(_T("GAMEOVER!")); dcMem.TextOutW(400,200,s,10);2.7鼠标键盘控制战机位置的函数OnLButtonDown(UINTnFlags,CPointpoint)//用于鼠标控制其位置OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)//用于键盘控制其位置其中GetKey(intnVirtKey)用于使键盘更加的灵活课进行粘连。2.8延迟函数Sleep(1000);//此句表示系统将延迟1000毫秒。2.9设置定时器定时器告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。SetTimer(1,30,NULL);//设置每30毫秒刷新一次2.10双缓冲技术关于双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲得虚拟的区域,然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。CDC*pDC=GetDC();CDCdcMem;dcMem.CreateCompatibleDC(pDC);//依附窗口DC创建兼容内存DC依次,所有的图像文字均存入dcMem中,然后一次性的通过pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);将内存DC上的图像拷贝到前台 dcMem.DeleteDC(); bmp.DeleteObject(); //pDC->SelectObject(Oldbrush); ReleaseDC(pDC); dcMem.FillSolidRect(rc,RGB(255,255,255));2.11内存释放技术在此次实训项目中有太多的对象的生成和运用,造成了内存的极度的紧张,当游戏进行到一定的程度的时候就会出现内存溢出现象。解决此问题的技术就是内存释放。内存释放技术的实现主要是通过释放各个满足一定条件的对象和链表来实现的,pDoc->m_ObjListBomb.RemoveAt(mPos2);用于删除指针 deletepDoc->Bomb;用于删除对象3.总体设计与详细设计总体设计主要课将其分为两大部分:规则子系统,游戏对象子系统。系统的总体结构图如下: 规则子系统主要是实现飞机大战各项游戏规则。实现需求中的游戏规则,组成结构图如下:主要是实现敌机战机的攻击和反攻的游戏规则等来实现计算机方和玩家进行对战。1、主要的攻击规则如下:1)、敌机可在战机的上方或者下方进行将子弹进行射向战机,同时战机也可根据玩家的指示进行向上或者向下进行发射导弹进行反攻。2)、攻击时发出声音。2、主要的碰撞规则如下:1)、导弹或者子弹本身的矩形区域和敌机或者战机的矩形区域相交时,表示其相互发生碰撞表示其相互爆炸。根据实战规则销毁游戏对象。2)、战机生命为0,战机被炸,战机被销毁,游戏结束。3)、敌机或者子弹被炸毁,将其进行销毁同时进行分数的相应的增加,并且出现文字提示。4)、爆炸时发出声音。3、主要时间控制规则如下: 1)、当游戏的持续时间超过特定的时间,游戏结束,出现文字提示。 2)、当游戏的关卡改变时进行游戏持续时间的一个相应的改变。游戏对象子系统主要包括:应用程序对象和游戏对象4、应用程序对象:1)、游戏程序的加载2)、游戏对象的绘制3)、游戏规则的调用4)、玩家键盘鼠标事件的获取5、游戏对象: 1)、各游戏对象的图像加载 2)、各游戏对象的贴图 3)、各游戏对象的位置存储3.1系统模块划分 系统模块划分主要分为如下表中的几个模块:游戏规则子系统模块名称功能简述人工智能人机对战规则的实现游戏子系统模块名称功能简述应用程序对象游戏程序的加载、游戏对象的绘制、游戏规则的调用、玩家的键盘事件获取游戏对象各个游戏对象的抽象父类战机对象战机类敌机对象敌机类导弹对象导弹类炸弹对象炸弹类爆炸对象爆炸类文字对象文字类其简单类图如下:3.2主要功能模块主要功能模块主要就是那些类的功能模块,主要有: 1、各个游戏对象的贴图模块2、敌机数量、方向、速度以及子弹的数量、方向和速度控制模块。3、战机的导弹的数目、方向和速度控制模块。4、战机的键盘控制和鼠标控制位置模块。5、敌机、子弹和战机、导弹的碰撞检测以及爆炸模块。6、背景添加模块。7、战机速度控制模块。8、游戏关卡游戏难易度设置和游戏关卡选择。9、游戏得分和生命值控制以及游戏关卡进入控制和游戏结束。10、游戏重新开始和游戏暂停控制模块。11、游戏音效控制模块。3.3扩展功能设计思路本次实训由于时间问题还有些扩展功能可进行增加,主要有: 1给游戏增加敌机类型,丰富画面,增加难度2、给游戏进行增加boss,通过boss的添加进行游戏的关卡和难度的更加进一步的提升。主要思路是:再增加一个类让它继承敌机类,然后再敌机类的基础上进行增加其生命值和被打死后的得分。当战机得分到达一定的值以后boss出现并进行和敌机一个队伍发射另类的子弹进行攻击战机。 3、完善暂停/重新开始/继续游戏等功能。 4、设置关卡,关卡越往后,难度越大,增加游戏的挑战性4.编码实现 此次实训的主要编码主要为:4.1游戏初始创建 if(GetKey(VK_RETURN)==1) { pDoc->bStart=1; } if(pDoc->bStart==0) { dcMem.SetTextColor(RGB(0,255,0)); dcMem.SetBkMode(TRANSPARENT); hFont=CreateFont(80,40,0,0,0,0,0,0,0,0,0,100,10,0); dcMem.SelectObject(hFont); TextOut(dcMem,cx/2-200,200,L"開始遊戲",4); dcMem.SetTextColor(RGB(0,255,0)); hFont=CreateFont(60,30,0,0,0,0,0,0,0,0,0,100,10,0); dcMem.SelectObject(hFont); TextOut(dcMem,cx/2-300,300,L"PRESS<<ENTER>>",15); //进行游戏的开始初始创建对象4.2定时器voidCPlaneFightView::OnInitialUpdate()//此函数用于进行定时器的设定voidCPLANEBOMPView::OnTimer(UINT_PTRnIDEvent)//在此设定器中进行各种函数的实现和调用进行相应时间的刷新4.3背景设定CBitmapbitmap;//封装了Windows图形设备接口中的位图,并且提供了操纵位图的成员函数 bitmap.LoadBitmap(IDB_BITMAP6); BITMAPbmp1;//位图图像 bitmap.GetBitmap(&bmp1); CDCDC;//定义一个兼容的DC DC.CreateCompatibleDC(&dcMem);//创建DC CBitmap*Old=DC.SelectObject(&bitmap); dcMem.StretchBlt(0,0,Rect.Width(),Rect.Height(),&DC,0,0,bmp1.bmWidth,bmp1.bmHeight,SRCCOPY);4.4键盘控制函数 intCPLANEBOMPView::GetKey(intnVirtKey) { return(GetKeyState(nVirtKey)&0x8000)?1:0; }if(GetKey(VK_LEFT)==1) pDoc->m_pMe->m_ptPos.x-=pDoc->mspeed; if(GetKey(VK_RIGHT)==1) pDoc->m_pMe->m_ptPos.x+=pDoc->mspeed; if(GetKey(VK_UP)==1) pDoc->m_pMe->m_ptPos.y-=pDoc->mspeed; if(GetKey(VK_DOWN)==1) pDoc->m_pMe->m_ptPos.y+=pDoc->mspeed; if(GetKey(VK_CONTROL)==1) { CBomb*cbo1=newCBomb(pDoc->m_pMe->m_ptPos.x+10,pDoc->m_pMe->m_ptPos.y,1); pDoc->m_ObListBomb.AddTail(cbo1);//存导弹 CBomb*cbo2=newCBomb(pDoc->m_pMe->m_ptPos.x+30,pDoc->m_pMe->m_ptPos.y,1); pDoc->m_ObListBomb.AddTail(cbo2);//存导弹 PlaySound((LPCTSTR)IDR_WAVE2,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC); } if(GetKey(VK_PAUSE)) { if(pDoc->bPause==1) pDoc->bPause=false; else pDoc->bPause=true; }4.5文字显示函数 //输出战机 pDoc->m_pMe->Draw(&dcMem,pDoc->bPause);//戰機 CStringbuffer; dcMem.SetTextColor(RGB(255,255,255)); dcMem.SetBkMode(TRANSPARENT); buffer.Format(_T("得分:%d"),pDoc->COUNT); dcMem.TextOutW(0,10,buffer); buffer.Format(_T("生命:%d"),pDoc->LIVE); dcMem.TextOutW(0,30,buffer); buffer.Format(_T("关卡:%d"),pDoc->style+1); dcMem.TextOutW(0,50,buffer); TextOut(dcMem,0,80,L"Pause暂停",9);5.6调用图片编码 POSITIONposBomb=NULL,posBomb_t=NULL; posBomb=pDoc->m_ObjListBomb.GetHeadPosition(); while(posBomb!=NULL) { posBomb_t=posBomb; pDoc->Bomb=(CBomb*)pDoc->m_ObjListBomb.GetNext(posBomb); if(pDoc->Bomb->GetPoint().x<0||pDoc->Bomb->GetPoint().x>Rect.Width()||pDoc->Bomb->GetPoint().y<0||pDoc->Bomb->GetPoint().y>Rect.Height()) { pDoc->m_ObjListBomb.RemoveAt(posBomb_t); deletepDoc->Bomb; } else pDoc->Bomb->Draw(&dcMem,1); } }4.6游戏对象进行碰撞测试和碰撞销毁,文字提示函数 POSITIONbPos1=NULL,bPos2=NULL; for(bPos1=pDoc->m_ObjListBomb.GetHeadPosition();(bPos2=bPos1)!=NULL;) { pDoc->Bomb=(CBomb*)pDoc->m_ObjListBomb.GetNext(bPos1); CRectbRect=pDoc->Bomb->GetRect();//获得导弹矩形区域 POSITIONePos11=NULL,ePos22=NULL; for(ePos11=pDoc->m_ObjListEn.GetHeadPosition();(ePos22=ePos11)!=NULL;) { pDoc->pEnemy=(CEnemy*)pDoc->m_ObjListEn.GetNext(ePos11); CRecteRect=pDoc->pEnemy->GetRect();//获得敌机矩形区域 CRecttmpRect; if(tmpRect.IntersectRect(&bRect,eRect))//判断两个矩形是否有交接 { //添加爆炸效果 pDoc->m_ObjListEx.AddTail(newCExplosion(eRect.left,eRect.top)); PlaySound((LPCTSTR)IDR_WAVE2,AfxGetInstanceHandle(),SND_RESOURCE|SND_ASYNC); pDoc->COUNT+=2; if(pDoc->timer<50) { CStrings0,s1,s2,s3,s4; dcMem.SetTextColor(RGB(0,255,0)); dcMem.SetBkMode(TRANSPARENT); hFont=CreateFont(30,20,0,0,0,0,0,0,0,0,0,100,10,0); dcMem.SelectObject(hFont); s0.Format(_T("COUNT+2")); dcMem.TextOutW(250,200,s0); pDoc->timer++; } else pDoc->timer=0; //删除zhadan pDoc->m_ObjListBomb.RemoveAt(bPos2); deletepDoc->Bomb; //删除敌机 pDoc->m_ObjListEn.RemoveAt(ePos22); deletepDoc->pEnemy; break; } } }4.7选择下一关卡以及选择完成后的执行代码if(pDoc->Boss1Death>=1) { pDoc->Boss1Death=0; pDoc->bPause=0; if(AfxMessageBox(L"是否进入下一关?",MB_YESNO)==6) { pDoc->style++; pDoc->bPause=1; pDoc->LIVE+=5; } else pDoc->bEnd=1;4.8游戏结束代码 if(pDoc->style>=10) { dcMem.SetTextColor(RGB(0,0,0)); dcMem.SetBkMode(TRANSPARENT); hFont=CreateFont(80,40,0,0,0,0,0,0,0,0,0,100,10,0); dcMem.SelectObject(hFont); TextOut(dcMem,cx/2-300,300,L"恭喜您全部通关",7); CStringbuffer; dcMem.SetTextColor(RGB(255,255,0)); dcMem.SetBkMode(TRANSPARENT); hFont=CreateFont(30,15,0,0,0,0,0,0,0,0,0,100,10,0); buffer.Format(_T("得分:%d"),pDoc->COUNT); dcMem.TextOutW(0,10,buffer); pDoc->bEnd=1; } if(pDoc->bEnd==1) { CStringbuffer; dcMem.SetTextColor(RGB(255,255,0)); dcMem.SetBkMode(TRANSPARENT); hFont=CreateFont(80,40,0,0,0,0,0,0,0,0,0,100,10,0); dcMem.SelectObject(hFont); buffer.Format(_T("得分:%d"),pDoc->COUNT); dcMem.TextOutW(cx/2-200,300,buffer); pDoc->bEnd=1; } 4.9鼠标控制战机代码 voidCPLANEBOMPView::OnLButtonDown(UINTnFlags,CPointpoint){ //TODO:在此添加消息处理程序代码和/或调用默认值 CView::OnLButtonUp(nFlags,point); CPLANEBOMPDoc*pDoc=GetDocument(); if(pDoc->Myplane!=NULL&&pDoc->time>0) { if(pDoc->Myplane->getpoint().x>0) pDoc->Myplane->setpoint(point.x,point.y); } this->Invalidat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论