c++飞机大战实训报告文档良心出品_第1页
c++飞机大战实训报告文档良心出品_第2页
c++飞机大战实训报告文档良心出品_第3页
c++飞机大战实训报告文档良心出品_第4页
c++飞机大战实训报告文档良心出品_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

实训报告飞机大战游戏设计与开发姓名:陆再旺专业名称:___数字媒体技术 班级: 2011级 学号:___201101051114 信息科学与工程学院二零一三年十二月目录项目概述 错误!未定义书签。相关技术 错误!未定义书签。2.1透明贴图技术 错误!未定义书签。2.2CObList技术 错误!未定义书签。2.3获取矩形区域函数 错误!未定义书签。2.4键盘控制战机位置函数 错误!未定义书签。TOC\o"1-5"\h\z\o"CurrentDocument"2.5设置定时器 4\o"CurrentDocument"2.6双缓冲技术 4\o"CurrentDocument"2.7内存释放技术 4\o"CurrentDocument"总体设计与详细设计 5\o"CurrentDocument"3.1规贝y子系统 5\o"CurrentDocument"3.2游戏对象子系统 5\o"CurrentDocument"3.3系统模块戈U分 6\o"CurrentDocument"3.4主要功能模块 7\o"CurrentDocument"编码实现 7\o"CurrentDocument"实训中遇到的主要问题及解决方法 11\o"CurrentDocument"实训体会 14项目概述此次实训主要是做一个飞机大战的游戏, 其需要实现的功能为: 实现游戏对象的爆炸特效,文字提示功能和界面背景特效,遵循游戏规则进行游戏; 。游戏中的重要角色可分为如下几个部分:战机,敌机,战机的导弹,敌机的子弹,游戏规则为:玩家通过键盘控制用一个战机去击毁从上下两端进入的尽可能多的敌机从而获得分数。敌机数量随机,进入画面对战机进行攻击,两者或战机导弹与敌机相遇是发生爆炸,战机生命结束即游戏结束。相关技术2.1透明贴图函数函数原型:Loadlmage(ClmageList& imageList,UNITbmpID,COLORcrMask,intcx,int cy,intnlnitial)〃此函数主要就是用于将图片放入图像链表 imageList中。(以画敌机为例)CGameObject::Loadlmage(m」mages,IDB_Enemy,RGB(0,0,0),ENEMY_HEIGHT,ENEMY_HEIGHT,0);m」mages.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);//此函数主要就是将m_Images链表中的图像显示在pDC这个句柄中。ILD_TRANSPAREN表示是透明贴图。它是相同大小图像的一个集合,每个集合中均以图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。可用 WINDOWS3位应用程序接口函数API来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像等操作。2.2CObList链表函数原型:CobListm_ObjListball;// 主要就是定义一个CObList类的一个链表对象用于存储所有的与此种相关的对象,易于后续的添加删除和提取数据。(以画敌机为例)CObListlistEnemy;POSITIONpos=listEnemy.GetHeadPosition();pos!=NULL; //读取头指针CEnemy*pEnemy=(CEnemy*)listEnemy.GetNext(pos); //GetNext获取循环遍历中的下一个2.3获取矩形区域函数CRectrect;//定义GetClientRect(&rect);〃 获取其矩形区域;//;//判断两个矩形是否有交接2.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个时间间隔,然后 WINDOW以此时间间隔周期性出发程序。通常由两种方法来实现:发送WM_TIME消息和调用应用程序定义的回调函数。2.6双缓冲技术双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲的虚拟的区域, 然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。CDCde;//定义新的设置上下文对象,下一步绘图就在这里CBitmapbitmap;//定义新的位置,实际是一块缓冲区dc.CreateCompatibleDC(NULL);//创建新的DCbitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); //创建与当前设备匹配的位图,分配缓冲区空间CBitmap*pOldBit=dc.SelectObject(&bitmap);pDC->BitBlt(O,O,rect.Width(),rect.Height(),&dc,O,O,SRCCOPY); //调用原系统DC的BitBlt方法,将新缓冲区的内容以 SRCCOPY原拷贝)模式复制给原系统DC,此时,图形将出现在屏幕上bitmap.DeleteObject(); //删除位图,释放空间dc.DeleteDC();//删除dc,释放空间ReleaseDC(pDC);2.7内存释放技术此项目中有太多的对象生成和运用, 造成了内存的极度紧张, 但游戏进行到一定的程度的时候就会出现内存溢出现象。解决此问题的技术就是内存释放。例:(以敌机为例)pDC->listEnemy.RemoveAt(lastpos);// 用于删除指针deletepDC;// 删除对象3•总体设计与详细设计有三个主要的部分组成,分别是规则子系统、游戏对象子系统。系统的总体结构图如下:3.1规则子系统该子系统主要是实现飞机大战各项游戏规则。实现了需求中的游戏规则。组成结构如下图所示:这个系统包含1个重要的模块,人工智能,它实现了敌机对战机的攻击以及游戏对象碰撞监测规则,其实实现的是代表计算机方玉玩家进行对战。攻击规则敌机在战机上方或下方时发射炸弹,炸弹从下至上或从上至下射向战机攻击时发出声音碰撞规则导弹或炸弹本身的矩形区域和敌机或战机的矩形区域相交时, 表示导弹或炸弹射中了战机或敌机战机被炸毁,游戏结束。敌机被炸毁,战机10分,出现文字提示。

爆炸时产生声音3.2游戏对象子系统该子系统包含了各个游戏对象的实现,它实现了需求中的部分规则以及游戏特效。本子系统的组织结构图如下:本子系统的组织结构图如下:应用程序对象游戏程序的加载游戏对象的绘制游戏规则的调用玩家的键盘事件获取游戏对象敌机图像加载敌机贴图位置存储3.3系统模块划分游戏规则子系统模块名称功能简述人工智能人机对战规则的实现游戏子系统模块名称功能简述应用程序对象游戏对象的绘制、游戏规则的调用、玩家的键盘事件获取游戏对象各个游戏对象的抽象父类战机对象战机类敌机对象敌机类导弹对象导弹类炸弹对象炸弹类爆炸对象爆炸类文字对象文字类3.4主要功能模块主要功能模块主要就是那些类的功能模块,主要有:各个游戏对象的贴图模块敌机数量、方向、速度、及子弹的数量、方向、和速度控制模块战机的导弹数目,方向和速度控制模块战机的键盘控制敌机、子弹、和战机、导弹的碰撞检测及爆炸模块背景添加模块游戏得分和生命值及游戏结束控制编码实现4.1创建各种游戏对象类(以敌机对象为例):文件名:Enemy.h#pragmaonce#include<stdlib.h>#include"gameobject.h"#include"resource.h"classCEnemy:publicCGameObject{public:CEnemyVoid);~CEnemyVoid);BOOLDraw(CDC*pDC,BOOLbPause);staticBOOLLoadlmage();CRectGetRect(){returnCRect(m_ptPos,CPoint(m_ptPos.x+ENEMY_HEIGHT,m_ptPos.y+ENEMY_HEIGHT));}intGetMontion() const{returnm_nMotion;}//是否可以开火发射子弹BOOLFired();private:staticconstintENEMY_HEIGHT=35;staticClmageListm_lmages;int m_nMotion; //方向1->向下0->停止-1->向上//图像索引intm_nImglndex;//速度intm_V;intm_nWait;//发射延时};文件名:Enemy.cpp#include"StdAfx.h"#include"Enemy.h"CImageListCEnemy::m」mages;//类外声明CEnemy::CEnemy(void){//rand(); 需先产生一个随机数种子srand(GetTickCount());m_ptPos.x=rand()%1100;m_nImgIndex=rand()%2; //=1向下飞,=0向上飞if(m_nlmglndex==1){m_ptPos.y=-rand()%500;m_nMotion=1; //方向向下}if(m_nlmglndex==0){m_ptPos.y=rand()%900+600;m_nMotion=-1;}m_V=3;}CEnemy::~CEnemy(void){}BOOLCEnemy::Draw(CDC*pDC,BOOLbPause){ m_ptPos.y+=m_V*m_nMotion;if(m_nMotion==1)m」mages.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);elsem」mages.Draw(pDC,1,m_ptPos,ILD_TRANSPARENT);returnTRUE;//m」mages.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);}BOOLCEnemy::LoadImage(){returnCGameObject::LoadImage(m」mages,IDB_Enemy,RGB(0,0,0),ENEMY_HEIGHT,ENEMY_HEIGHT,0);}4.2键盘控制函数if(GetKeyState(VK_LEFT)&0x80)

{if(plane.GetPoint().x<=0)plane.SetHorMotion(0);elseplane.SetHorMotion(-1);}if(GetKeyState(VK_RIGHT)&0x80){if(plane.GetPoint().x+50>=rect.Width())plane.SetHorMotion(0);elseplane.SetHorMotion(1);}if(GetKeyState(VK_UP)&0x80){if(plane.GetPoint().y<=0)plane.SetVerMotion(0);elseplane.SetVerMotion(-1);}if(GetKeyState(VK_DOWN)&0x80){if(plane.GetPoint().y+60>=rect.Height())plane.SetVerMotion(0);elseplane.SetVerMotion(1);}if(GetKeyState(VK_SPACE)&0x80){listBomb.AddTail(newCBomb(plane.GetPoint().x,plane.GetPoint().y+20));listBomb.AddTail(newCBomb(plane.GetPoint().x+20,plane.GetPoint().y));listBomb.AddTail(newCBomb(plane.GetPoint().x+40,plane.GetPoint().y+20));}局部变量4.3文字显示函数局部变量static intLife=25;II该变量的赋值操作只执行一次static intScore=0;dc.SetBkMode(TRANSPARENT)//设置文字背景为透明dc.SetTextColor(RGB(255,0,0));CStringLIFE;LIFE.Format(L"剩余生命:%d",Life);II转化成字符串dc.TextOut(10,10,LIFE);dc.SetBkMode(TRANSPARENT);//设置文字背景为透明dc.SetTextColor(RGB(0,0,255));CStringSCORE;SCORE.Format(L"目前得分:%d",Score);II转化成字符串dc.TextOut(1O,3O,SCORE);dc.SetBkMode(TRANSPARENT);II设置文字背景为透明dc.SetTextColor(RGB(255,255,255));if(Life<=0){if(Score<=1000){SCORE.Format(L"最终得分:%d!!!继续努力哟!! ”,Score);II转化成字符串dc.TextOut(4OO,3OO,SCORE);}else{SCORE.Format(L"最终得分:%d!!!你很棒哦!! ”,Score);II转化成字符串dc.TextOut(4OO,3OO,SCORE);}KillTimer(l);}4.4相撞产生爆炸效果(以我方导弹和敌机相撞为例)for(pos=listBall.GetHeadPosition();pos!=NULL;) II敌机子弹{lastpos=pos;CBall*pBall=(CBall*)listBall.GetNext(pos);CRectrect2;II求矩形交集,即是否相撞if(rect2.IntersectRect(pBall->GetRect(),plane.GetRect())){ Life-=1;II敌机子弹击中我机,添加爆炸效果listExplosion.AddTail( newCExplosion(plane.GetRect().left,plane.GetRect().top)); II爆炸效果listBall.RemoveAt(lastpos);deletepBall;}elseif(pBall->GetPoint().y<-9||pBall->GetPoint().y>rect.Height()){listBall.RemoveAt(lastpos);deletepBall;}else{pBall->Draw(&dc,TRUE);}}boolflag=false;//标记导弹是否击中敌机,true为击中for(pos=listBomb.GetHeadPosition();pos!=NULL;) //我方导弹{flag=false;lastpos=pos;CBomb*pBomb=(CBomb*)listBomb.GetNext(pos);POSITIONpos1,lastpos1;for(pos1=listEnemy.GetHeadPosition();pos1!=NULL;){lastpos仁pos1;CEnemy*penemy=(CEnemy*)listEnemy.GetNext(pos1);CRectrect3; //求矩形交集,即是否相撞if(rect3.lntersectRect(pBomb->GetRect(),penemy->GetRect())){Score+=10;//我方导弹与敌机相撞了,添加爆炸效果listExplosion.AddTail( newCExplosion(pBomb->GetRect().left,pBomb->GetRect().top)); //爆炸效果listEnemy.RemoveAt(lastpos1);deletepenemy;//删除敌机listBomb.RemoveAt(lastpos);deletepBomb;II删除导弹break;flag=true;}elseif(pBomb->GetPoint().y<-21||pBomb->GetPoint().y>rect.Height()){listBomb.RemoveAt(lastpos);deletepBomb;break;}else{pBomb->Draw(&dc,TRUE);}}if(flag)break;}实训中遇到的主要问题及解决方法5.1问题:闪屏解决方案:双缓冲技术CDC*pDC=GetDC();CRectrect;GetClientRect(&rect);CDCdc;//定义新的设置上下文对象,下一步绘图就在这里CBitmapbitmap;//定义新的位置,实际是一块缓冲区dc.CreateCompatibleDC(NULL);//创建新的DCbitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); //创建与当前设备匹配的位图,分配缓冲区空间CBitmap*pOldBit=dc.SelectObject(&bitmap);pDC->BitBlt(O,O,rect.Width(),rect.Height(),&dc,O,O,SRCCOPY); //调用原系统DC的BitBlt方法,将新缓冲区的内容以 SRCCOPY原拷贝)模式复制给原系统DC,此时,图形将出现在屏幕上bitmap.DeleteObject(); //删除位图,释放空间dc.DeleteDC();//删除dc,释放空间ReleaseDC(pDC);5.2问题:键盘控制时出现阴影解决方案:键盘控制时消除虚影,及实现刷屏GetClientRect(rect);dc.Rectangle(rect);5.3问题:键盘控制时按键一下一直移动解决方案:使用OnKeyUp函数voidCtext3View::OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags){IITODO:在此添加消息处理程序代码和 /或调用默认值switch(nChar){caseVK_LEFT:plane.SetHorMotion(0);break;caseVK_RIGHT:plane.SetHorMotion(0);break;

caseVK_UP:plane.SetVerMotion(0);break;caseVK_DOWN:plane.SetVerMotion(0);break;}5.4问题:按键停顿解决方案:将按键控制放在OnTimer函数里voidCtext3View::OnTimer(UINT_PTRnIDEvent){if(GetKeyState(VK_LEFT)&0x80){if(plane.GetPoint().x<=0)plane.SetHorMotion(0);elseplane.SetHorMotion(-1);}if(GetKeyState(VK_RIGHT)&0x80){if(plane.GetPoint().x+50>=rect.Width())plane.SetHorMotion(0);elseplane.SetHorMotion(1);}if(GetKeyState(VK_UP)&0x80){if(plane.GetPoint().y<=0)plane.SetVerMotion(0);elseplane.SetVerMotion(-1);}if(GetKeyState(VK_DOWN)&0x80){if(plane.GetPoint().y+60>=rect.Height())plane.SetVerMotion(0);elseplane.SetVerMotion(1);}if(GetKeyState(VK_SPACE)&0x80){listBomb.AddTail( newCBomb(plane.GetPoint().x,plane.GetPoint().y+20));listBomb.AddTail(listBomb.AddTail(listBomb.AddTail(listBomb.AddTail(CBomb(plane.GetPoint().x+40,plane.GetPoint().y+20));}}5.5问题:程序中断问题解决方案:在我机导弹与敌机相撞代码中加入标识符,防止指针悬空。bo

温馨提示

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

评论

0/150

提交评论