飞机大战实训.doc

上传人:仙人指路1688 文档编号:2913799 上传时间:2023-03-03 格式:DOC 页数:21 大小:198KB
返回 下载 相关 举报
飞机大战实训.doc_第1页
第1页 / 共21页
飞机大战实训.doc_第2页
第2页 / 共21页
飞机大战实训.doc_第3页
第3页 / 共21页
飞机大战实训.doc_第4页
第4页 / 共21页
飞机大战实训.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《飞机大战实训.doc》由会员分享,可在线阅读,更多相关《飞机大战实训.doc(21页珍藏版)》请在三一办公上搜索。

1、实 训 报 告飞机大战游戏设计与开发王上前专业名称:物联网工程班 级:物联网11级1班学 号:20111052131信息科学与工程学院二零一二年十二月目 录1. 概述031.1 实训项目简介031.2 实训功能说明031.2.1 基本功能032. 相关技术032.1 基类的使用032.2 Windows定时器技术032.3获取矩形区域032.4内存释放043. 总体设计与详细设计043.1 系统模块划分043.2 主要功能模块054. 编码实现205. 实训中遇到的主要问题及解决方法216. 实训体会211. 概述1.1 实训项目简介本次实训项目是做一个飞机大战的游戏,完成一个界面简洁流畅、游

2、戏方式简单,玩起来易于上手的桌面游戏。该飞机大战项目运用的主要技术即是MFC编程中的一些函数、链表思想以及贴图技术。1.2 实训功能说明1.2.1 基本功能(1)设置一个战机具有一定的速度,通过键盘,方向键可控制战机的位置,空格键发射子弹。(2)界面中敌机出现的位置为随机的。(3)对于随机产生的敌机和敌机炸弹,若超过矩形区域,则释放该对象。(4)添加爆炸效果,包括战机子弹打中敌机爆炸、敌机炸弹打中战机爆炸、战机与敌机相撞爆炸以及战机子弹与敌机炸弹相撞爆炸四种爆炸效果。且爆炸发生后敌机、子弹、炸弹均消失。2. 相关技术2.1基类的使用 在飞机大战的游戏中用到了很多基类,例如MyPlane、Bom

3、b等等,这样使得游戏的实现更加规范,有效性。通过主函数的调用,实现了很多功能。2.2 Windows定时器技术Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。本程序中使用多个定时器,分别控制不同的功能。在MFC的API函数中使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。2.3获取矩形区域首先,使用CRect定义一个对象,然后使用GetClientRect(&对象名)函数,获取界

4、面的矩形区域rect.Width() 为矩形区域的宽度,rect.Height()为矩形区域的高度。使用IntersectRect(&,&)函数来判断两个源矩形是否有重合的部分。如果有不为空,则返回非零值;否则,返回0。2.4内存释放在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃。及时的释放程序所占用的内存资源是非常重要的。在程序中使用到的刷子等占用内存资源的对象都要及时的删除。Delete Brush等。3. 总体设计与详细设计3.1 系统模块划分飞机大战游戏主要模块可以说是有几个重要的类组成的。首先是老师给出的CGa

5、meObject类,以及在其派生下的BOMB,BALL,ENEMY,MYPLANE等等。如图:3.2 主要功能模块主要功能是在飞机大战View类中,OnTimer函数中实现,将各个类调用,随机产生敌机,子弹的输出,爆炸的实现等等。它的实现图可以如下实现:4. 编码实现4.1飞机大战view.cpp#include stdafx.h#include 飞机大战.h#include 飞机大战Doc.h#include 飞机大战View.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ C飞机大战ViewIMPLEMENT_DYNCREATE(C飞机大战View,

6、CView)BEGIN_MESSAGE_MAP(C飞机大战View, CView)/ 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView:OnFilePrintPreview)ON_WM_CREATE()ON_WM_TIMER()ON_WM_KEYDOWN()ON_WM_KEYUP()END_MESSAGE_MAP()/ C飞机大战View 构造/析构C飞机大战

7、View:C飞机大战View()/ TODO: 在此处添加构造代码C飞机大战View:C飞机大战View()BOOL C飞机大战View:PreCreateWindow(CREATESTRUCT& cs)/ TODO: 在此处通过修改/ CREATESTRUCT cs 来修改窗口类或样式return CView:PreCreateWindow(cs);/ C飞机大战View 绘制void C飞机大战View:OnDraw(CDC* /*pDC*/)C飞机大战Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;/ TODO:

8、 在此处为本机数据添加绘制代码/ C飞机大战View 打印BOOL C飞机大战View:OnPreparePrinting(CPrintInfo* pInfo)/ 默认准备return DoPreparePrinting(pInfo);void C飞机大战View:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加额外的打印前进行的初始化过程void C飞机大战View:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加打印后进行的清理过程/ C飞机大

9、战View 诊断#ifdef _DEBUGvoid C飞机大战View:AssertValid() constCView:AssertValid();void C飞机大战View:Dump(CDumpContext& dc) constCView:Dump(dc);C飞机大战Doc* C飞机大战View:GetDocument() const / 非调试版本是内联的ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(C飞机大战Doc);return (C飞机大战Doc*)m_pDocument;#endif /_DEBUG/ C飞机大战View 消息处理程序in

10、t C飞机大战View:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: 在此添加您专用的创建代码SetTimer(1, 20, 0);CMyPlane:LoadImageW();/-为什么不能放在OnTimer里面? CEnemy:LoadImage(); CExplosion:LoadImage(); CBomb:LoadImage(); CBall:LoadImage();return 0;void C飞机大战View:OnTimer(UINT_

11、PTR nIDEvent)/ TODO: 在此添加消息处理程序代码和/或调用默认值 SHORT key;key=GetKeyState(VK_DOWN); if(key&0x80)plane.SetVerMotion(1);key=GetKeyState(VK_RIGHT);if(key&0x80)plane.SetHorMotion(1);key=GetKeyState(VK_LEFT);if(key&0x80)plane.SetHorMotion(-1);key=GetKeyState(VK_UP);if(key&0x80)plane.SetVerMotion(-1); /*CDC Mem

12、DC;*/定义一个显示设备对象 static int life=50;static int g=1; static int score=0; /CBitmap MemBmap;/定义一个位图对象 CDC *pDC=GetDC();CRect rect;GetClientRect(&rect); CBrush m_brushBackground,m_brushBackground1,m_brushBackground2,brush,brush1;CBitmap bmp,bnp,bnp1;bmp.LoadBitmap(IDB_Beijing); /加载位图 m_brushBackground.Cr

13、eatePatternBrush(&bmp);/创建位图画刷 pDC-FillRect(rect,&m_brushBackground); /用背景画刷填充区域 /添加文字pDC-SetBkMode(TRANSPARENT);/设置文字背景透明pDC-SetTextColor(RGB(255,0,0);/设置文字颜色为黄色CFont font;font.CreateFont( 0, / nHeight 0, / nWidth 0, / nEscapement 0, / nOrientation FW_NORMAL, / nWeight FALSE, / bItalic FALSE, / bUn

14、derline 0, / cStrikeOut ANSI_CHARSET, / nCharSet OUT_DEFAULT_PRECIS, / nOutPrecision CLIP_DEFAULT_PRECIS, / nClipPrecision DEFAULT_QUALITY, / nQuality DEFAULT_PITCH | FF_SWISS, / nPitchAndFamily _T(宋体) ); / lpszFacenameCFont *oldFont=pDC-SelectObject(&font);/pDC-SelectObject(oldFont);CString Life;/显

15、示生命值Life.Format(L生命:%d,life);pDC-TextOutW(rect.Width()/2-200,10,Life);CString Guan;/显示生命值Guan.Format(L关数:%d,g);pDC-TextOutW(rect.Width()/2-300,10,Guan);CString kan;/显示生命值kan.Format(L注意:上,下,左,右,开火space,暂停ctrl);pDC-TextOutW(rect.Width()/2-8,10,kan);CString grade;/显示分数grade.Format(L分数:%d,score);pDC-Sel

16、ectObject(oldFont);pDC-TextOutW(rect.Width()/2-100,10,grade); plane.Draw(pDC, TRUE);/画出战机/添加爆炸效果POSITION posExplosion=NULL;for(posExplosion=listExplosion.GetHeadPosition();posExplosion!=NULL; )CExplosion *pExplosion=(CExplosion*)listExplosion.GetNext(posExplosion);pExplosion-Draw(pDC,false);if(score

17、=0&score=300)g=1; if (listEnemy.GetCount()=110&score=600)g=2; if (listEnemy.GetCount()610&score=1200)g=3; if (listEnemy.GetCount()=1210&score=1800)g=4; if (listEnemy.GetCount()=1810&score=3000)g=5; if (listEnemy.GetCount()GetRect(),plane.GetRect()/敌机子弹速度 int x=rand()%50; if(x=0) listBall.AddTail(new

18、 CBall(pEnemy-GetPoint().x+6,pEnemy-GetPoint().y+25,pEnemy-GetMontion(); listBall.AddTail(new CBall(pEnemy-GetPoint().x+20,pEnemy-GetPoint().y+25,pEnemy-GetMontion(); pEnemy-Draw(pDC,TRUE); else listEnemy.RemoveAt(oldpos); listExplosion.AddTail(new CExplosion(rect.left,rect.top);/敌机爆 life-=1; break;

19、 POSITION posBomb,oldposBomb;/导弹设置CBomb* pBomb;posBomb=listBomb.GetHeadPosition();while(posBomb!=NULL)/GetHeadPosition 返回列表中首元素的位置CRect enRect;oldposBomb=posBomb;pBomb= (CBomb *)listBomb.GetNext(posBomb);/GetNext(pos)获取列表元素标识由rPosition,然后设置rPosition 到下一项的POSITION 值列表中的。 /CRect enemyRect = pEnemy-Get

20、Rect();/获得敌机机区域/if(!enRect.IntersectRect(pEnemy-GetRect(),pBomb-GetRect()/矩形框没有交集 pBomb-Draw(pDC,true); /战机子弹炸掉敌机if(life!=0)POSITION B1=NULL,B2=NULL;B1=listBomb.GetHeadPosition();while(B2=B1)!=NULL)/GetHeadPosition 返回列表中首元素的位置 pBomb= (CBomb*)listBomb.GetNext(B1);/GetNext获取循环遍历中的下一个元素 CRect bRect = p

21、Bomb-GetRect();/获得导弹区域POSITION E1=NULL,E2=NULL;E1=listEnemy.GetHeadPosition();while(E2=E1)!=NULL)/GetHeadPosition 返回列表中首元素的位置pEnemy=(CEnemy*)listEnemy.GetNext(E1);CRect eRect=pEnemy-GetRect();/获得敌机区域CRect enRect;/定义一个区域,该区域作用为获得导弹和敌机区域的交集。if(enRect.IntersectRect(&bRect,eRect)/若导弹和敌机有交集,删除导弹和敌机,添加爆炸效

22、果score+=20;/添加炸弹效果listExplosion.AddTail(new CExplosion(eRect.left, eRect.top);/删除导弹listBomb.RemoveAt(B2);/RemoveAt 从列表中删除指定位置的元素 delete pBomb;/删除敌机listEnemy.RemoveAt(E2);delete pEnemy;break;/敌机子弹炸掉战机if(life!=0) POSITION C1=NULL,C2=NULL;CRect mRect = plane.GetRect();/获得战机区域C1=listBall.GetHeadPosition

23、();while( C2 = C1 ) != NULL)/GetHeadPosition 返回列表中首元素的位置pBall = (CBall*)listBall.GetNext(C1);CRect bRect = pBall-GetRect();/获得子弹区域CRect tmpRect;if(tmpRect.IntersectRect(&bRect,mRect)/子弹区域与战机区域相交life-=1;/添加炸弹效果listExplosion.AddTail(new CExplosion(mRect.left,mRect.top);/删除子弹listBall.RemoveAt(C2);delet

24、e pBall;break; /添加敌机子弹POSITION posBall=NULL;/*CBall* pBall;*/posBall=listBall.GetHeadPosition();/CRect enemyRect = pEnemy-GetRect();/获得敌机机区域while(posBall!=NULL)/CRect enemyRect = pEnemy-GetRect();/获得敌机机区域CBall* pBall=(CBall *)listBall.GetNext(posBall);pBall-Draw(pDC, false); /listBall.AddTail(new CB

25、all(pEnemy-GetPoint().x+12,pEnemy-GetPoint().y+25,pEnemy-GetMontion(); if(score%200=0&score!=0)life+=1;score+=20;if(lifeFillRect(rect,&m_brushBackground1); /用背景画刷填充区域KillTimer(1); ReleaseDC(pDC);CView:OnTimer(nIDEvent);void C飞机大战View:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)/ TODO: 在此添加消息处理程序

26、代码和/或调用默认值 if (nChar=VK_LEFT)plane.SetHorMotion(-1);else if(nChar=VK_RIGHT)plane.SetHorMotion(1);else if(nChar=VK_UP)plane.SetVerMotion(-1);else if(nChar=VK_DOWN)plane.SetVerMotion(1);if(nChar=VK_CONTROL)/ctrl键表示暂停Sleep(2000);/暂停5秒 else if(nChar=VK_SPACE)/空格键/战机添加导弹 listBomb.AddTail(new CBomb(plane.

27、GetPoint().x+10,plane.GetPoint().y+20); listBomb.AddTail(new CBomb(plane.GetPoint().x+30,plane.GetPoint().y+20); CView:OnKeyDown(nChar, nRepCnt, nFlags);void C飞机大战View:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)/ TODO: 在此添加消息处理程序代码和/或调用默认值 if(pMyPlane!=NULL)if(nChar=VK_RIGHT)plane.SetHorMotion(0)

28、;if(nChar=VK_LEFT)plane.SetHorMotion(0);if(nChar=VK_UP)plane.SetVerMotion(0);if(nChar=VK_DOWN)plane.SetVerMotion(0);CView:OnKeyUp(nChar, nRepCnt, nFlags);4.2MyPlane.cpp#include StdAfx.h#include MyPlane.h#include resource.hCImageList CMyPlane:m_Images;CMyPlane:CMyPlane(void)m_ptPos.x=400; m_ptPos.y=4

29、00; m_nHorMotion=0; m_nVerMotion=0;CMyPlane:CMyPlane(void)BOOL CMyPlane:Draw(CDC* pDC,BOOL bPause) m_ptPos.x=m_ptPos.x+m_nHorMotion*5;m_ptPos.y=m_ptPos.y+m_nVerMotion*5;/使飞机在屏幕内if(m_ptPos.x=1000)m_ptPos.x=1000;if(m_ptPos.x=0)m_ptPos.x=0;if(m_ptPos.y=600)m_ptPos.y=580; return m_Images.Draw(pDC,0,m_pt

30、Pos, ILD_TRANSPARENT);BOOL CMyPlane:LoadImage() return CGameObject:LoadImage(m_Images,IDB_Myplane,RGB(0,0,0),50,60,1);4.3 Enemy.cpp#include StdAfx.h#include Enemy.h#include resource.hCImageList CEnemy:m_Images;CEnemy:CEnemy(void)srand(GetTickCount();m_ptPos.x=rand()%990;/rand产生随机数,初始敌机位置m_ptPos.y=0;

31、m_V=rand()%5+1;m_nImgIndex=rand()%2;/上下飞机if(m_nImgIndex=0) m_nMotion=1; m_ptPos.y=0;if(m_nImgIndex=1) m_nMotion=-1; m_ptPos.y=700;CEnemy:CEnemy(void)BOOL CEnemy:Draw(CDC *pDC, BOOL bPause) if(m_ptPos.y=700)m_ptPos.y=0;if(m_ptPos.y=1000)return FALSE;if(m_ptPos.y=800)return FALSE;BOOL CBomb:LoadImageW

32、()return CGameObject:LoadImageW(m_Images,IDB_Bomb,RGB(0,0,0),10,20,1);4.5Ball.cpp#include StdAfx.h#include Ball.h#include resource.hCImageList CBall:m_Images;CBall:CBall(int x,int y,int nMotion) m_ptPos.x=x;m_ptPos.y=y;m_nMotion=nMotion;CBall:CBall(void)BOOL CBall:Draw(CDC* pDC,BOOL bPause)m_ptPos.y

33、= m_ptPos.y+m_nMotion*6;/固定子弹速度为10return m_Images.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT);/使子弹在屏幕内if(m_ptPos.x=1000)return FALSE;if(m_ptPos.y=700)return FALSE;BOOL CBall:LoadImage() return CGameObject:LoadImage(m_Images,IDB_Ball,RGB(0,0,0),8,8,1);4.6Explosion.cpp#include StdAfx.h#include Explosion.h#inc

34、lude resource.hCImageList CExplosion:m_Images;CExplosion:CExplosion(int x,int y) m_ptPos.x=x;m_ptPos.y=y;m_nProcess=0;CExplosion:CExplosion(void)BOOL CExplosion:Draw(CDC* pDC,BOOL bPause)m_Images.Draw(pDC,m_nProcess,m_ptPos,ILD_TRANSPARENT);m_nProcess+;if (m_nProcess=8)return FALSE;elsereturn TRUE;B

35、OOL CExplosion:LoadImage() return CGameObject:LoadImage(m_Images,IDB_Explosion,RGB(0,0,0),66,66,8);4.7GameObject.cpp#include stdafx.h#include GameObject.h/ CGameObjectCGameObject:CGameObject(int x,int y):m_ptPos(x,y)CGameObject:CGameObject()BOOL CGameObject:LoadImage(CImageList& imgList,UINT bmpID,COLORREF crMask,int cx,int cy,int nInitial)CBitmap bmp;if(!bmp.LoadBitmap(bmpID)return FALSE;if(!imgList.Create(cx, cy, ILC_COLOR24|ILC_MASK, nInitial, 0)return FALSE;imgList.Add(&bmp, crMask);return TRUE;5. 实训中遇到的主要问题及解决方法5.1(问题一)当实现一架敌机运动时,怎样实现多架敌机的随机运动,通过老师的提示及询问同学解决了此问题。5

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号