版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实 训 报 告飞机大战游戏设计与开发 专业名称: 物联网工程 班 级: 物联网一班姓 名: 李 万 学 号: 201301052208信息科学与工程学院二零一四年十二月1 / 14 目 录1. 概述32. 相关技术32.1关于碰撞检测的相关函数32.2 CObList链表32.3 设置定时器、销毁定时器32.4 双缓冲绘图33. 总体设计与详细设计33.1 系统模块划分33.1.1规则子系统43.1.2 游戏对象子系统43.2 主要功能模块54. 编码实现54.1 游戏初始化54.2 设置动态背景64.3 显示文字以及绘制游戏对象74.4 随机产生敌机84.5 战机移动以及发射导弹84.6 敌
2、机发射炮弹94.7 碰撞检测及音效105. 实训中遇到的主要问题及解决方法146. 实训体会141. 概述飞机大战游戏是在Microsoft Visual Studio编程软件的MFC环境下制作的一款游戏,界面简洁流畅、游戏方式简单。 游戏主要实现的功能和规则如下:(1)利用键盘中的上下左右键控制我方战机,空格键发射子弹。战机初始有一定量的血量。(2)屏幕上随机产生敌机,战机产生的数量和当前关卡,关卡越高,产生的敌机越多,游戏难度越大。而且敌机产生的位置和速度是不确定的。只有当我机位于敌机下方时,敌机才会产生子弹,默认情况下是不发射任何子弹的。(3)战机子弹打中敌机,敌机就会爆炸,同时玩家分数
3、会增加,每得1000分进入下一关。 2. 相关技术 在设计该游戏时,用到许多技术,这里介绍几个相对重要的技术。2.1关于碰撞检测的相关函数用CRect类的GetRect()函数可以获得当前对象的矩形区域, IntersectRect()并用此函数判断战机与敌机,子弹与战机,我方导弹与敌机,战机与物品是否相撞。2.2 CObList链表使用CObList链表来分别存储敌机,炸弹,导弹,爆炸效果。CobList类似于一个双向链表,POSITION类型的变量为链表的键。使用POSITION变量,既可以作为链表循环中的循环变量,也可以作为标记某个位置的标签。我们可以通过获得某元素的POSITION来访
4、问它。本程序中主要用到的函数有:GetHeadPosition()获取链表首元素的POSITION;AddTail()向链表尾部添加新的元素;GetNext( POSITION& rPosition )返回当前rPosition指向的元素,并使rPosition指向下一个元素。2.3 设置定时器、销毁定时器SetTimer()函数来设置定时器,控制每隔多少毫秒执行一次什么任务。用KillTime()函数来销毁定时器。2.4 双缓冲技术 为了避免窗体频繁闪烁,引入双缓冲技术。双缓冲的原理是先建立一个内存DC,将游戏对象绘制到内存DC上,再一次性的把内存中绘制好的图形“拷贝”到设备DC上。
5、采取这种方法可以提高绘图速度,极大的改善绘图效果。3. 总体设计与详细设计3.1 系统模块划分有两个主要的部分组成,分别是规则子系统、游戏对象子系统。3.1.1规则子系统该子系统主要是实现飞机大战各项游戏规则。实现了需求中的游戏规则。这个系统模块实现了敌机对战机的攻击、以及游戏对象碰撞检测规则。² 攻击规则n 敌机在战机上方时发射炸弹,炸弹从上至下射向战机² 碰撞规则n 战机所在矩形区域与奖品所在矩形区域相交时,表示战机获得该奖励。n 导弹或炸弹本身的矩形区域和敌机或战机的矩形区域相交时,表示导弹或炸弹射中了敌机或战机。n 敌机击中战机,战机血量减少。n 战机击中敌机,敌机
6、被炸毁,战机得分增加。n 战机血量为0,游戏结束。3.1.2 游戏对象子系统该子系统包含了各个游戏对象的实现。² 应用程序对象l 游戏程序的加载l 游戏对象的绘制l 游戏规则的调用l 玩家的键盘事件获取² 游戏对象l 敌机绘图l 战机绘图l 子弹绘图l 爆炸效果绘图类体系如下: 主要有CMyPlane:战机,CEnemy:敌机,CIenemy:敌机boss,CBall:炮弹,CBobm:导弹,CExplossion:爆炸效果,CHeart:红心(吃了可以加血)。3.2 主要功能模块主要功能模块主要就是那些类的功能模块,主要有:1、各个游戏对象的贴图模块 2、敌机数
7、量、方向、速度以及子弹的数量、方向和速度控制模块。3、战机的导弹的数目、方向和速度控制模块。4、战机的键盘控制位置模块。 5、敌机、子弹和战机、导弹的碰撞检测以及爆炸模块。 6、背景添加模块。 7、战机速度控制模块。 8、游戏关卡和游戏难易度。 9、游戏得分和生命值控制以及游戏结束。10、游戏音效控制模块。4. 编码实现由于编写了多个类来实现该游戏功能,所以程序较多,这里只展示核心部分。程序如下:4.1游戏初始化void CPlaneGameView:OnInitialUpdate()CView:OnInitialUpdate();/ TODO
8、: 在此添加专用代码和/或调用基类/初始化游戏 m_pDC=new CClientDC(this);m_pMemDC=new CDC; m_pMemDC->CreateCompatibleDC(m_pDC);m_pMemBitmap=new CBitmap;/建立内存位图CRect ck;this->GetClientRect(&ck);m_pMemBitmap->CreateCompatibleBitmap(m_pDC,ck.Width(),ck.Height();m_pMemDC->SelectObject(m_pMemBitmap);/将位图选入内存DC
9、CRect rc;GetClientRect(rc);/产生随机数种子srand( (unsigned)time( NULL ) );/建立设备DCm_pDC = new CClientDC(this);/建立内存DCm_pMemDC = new CDC;m_pMemDC->CreateCompatibleDC(m_pDC);/建立内存位图m_pMemBitmap = new CBitmap;m_pMemBitmap->CreateCompatibleBitmap(m_pDC,GAME_WIDTH,GAME_HEIGHT);/将位图选入内存DCm_pMemDC->Select
10、Object(m_pMemBitmap);CMyPlane:LoadImage();CEnemy:LoadImage();CBomb:LoadImage();CBall:LoadImage();CExplosion:LoadImage();CHeart:LoadImage();CIenemy:LoadImage();/产生主我方战机m_pMe = new CMyPlane;/启动游戏SetTimer(1,30,NULL); SetTimer(2, 240, NULL);4.2设置动态背景CBitmap bmp;bmp.LoadBitmapW(IDB_Background); /创建位图m_pM
11、emDC->SelectObject(&bmp);pMemDC->BitBlt(0,0,800,600,m_pMemDC,0,imagelocation,SRCCOPY);/设置动态背景if(imagelocation < 0)imagelocation = 600; imagelocation-= 2; DeleteObject(&bmp);4.3显示文字以及绘制游戏对象 pMemDC->SetBkMode(TRANSPARENT);/文字背景透明 wsprintf(lifeleft, L"生命值:%d", m_pMe->HP
12、 ); pMemDC->SetTextColor( RGB(255, 255,0) ); /字体颜色 pMemDC->TextOutW(10,10, lifeleft, _tcslen(lifeleft);/字体位置 wsprintf(lifeleft, L"剩余命数:%d", m_pMe->life ); pMemDC->SetTextColor( RGB(255, 255,0) ); pMemDC->TextOutW(10,35, lifeleft, _tcslen(lifeleft); wsprintf(Score, L"得分:
13、%d", m_pMe->score ); pMemDC->SetTextColor( RGB(255, 0, 0) ); pMemDC->TextOutW(10,60, Score, _tcslen(Score); wsprintf(Level, L" 第%d 关", m_pMe->level ); pMemDC->SetTextColor( RGB(255, 255, 255) ); pMemDC->TextOutW(10,85, Level, _tcslen(Level);/绘制我方战机if(m_pMe!=NULL) m_p
14、Me->Draw(m_pMemDC,FALSE);else /游戏结束提醒CString str=_T("Game Over!");pMemDC->SetBkMode(TRANSPARENT);pMemDC->SetTextAlign(TA_CENTER);pMemDC->SetTextColor(RGB(255,0,0);pMemDC->TextOut(GAME_WIDTH/2,GAME_HEIGHT/2,str);if(m_pMe!=NULL && m_pMe->score >= 10000) /游戏胜利提醒 C
15、String str=_T("You Win!");pMemDC->SetBkMode(TRANSPARENT);pMemDC->SetTextAlign(TA_CENTER);pMemDC->SetTextColor(RGB(255,0,0);pMemDC->TextOut(GAME_WIDTH/2,GAME_HEIGHT/2,str);/绘制飞机炮弹、敌机、奖励、for(int i=0;i<7;i+)POSITION pos1,pos2;for( pos1 = m_ObjListi.GetHeadPosition(); ( pos2 = p
16、os1 ) != NULL; )CGameObject* pObj = (CGameObject*)m_ObjListi.GetNext( pos1 );if(!pObj->Draw(pMemDC,FALSE)m_ObjListi.RemoveAt(pos2);delete pObj;/复制内存DC到设备DCm_pDC->BitBlt(0,0,GAME_WIDTH,GAME_HEIGHT,m_pMemDC,0,0,SRCCOPY);4.4随机产生敌机/随机产生敌机if(m_pMe!=NULL && m_pMe->score < 10000 ) /控制生成
17、条件 static int nCreator = rand() %5; if(nCreator<=m_pMe->level) nCreator = rand()%5+10; m_ObjListenEnemy.AddTail(new CEnemy); nCreator-; if(m_pMe=NULL | m_pMe->score >= 10000) /通关或者没有生命剩余,不再产生敌机return; 4.5战机移动以及发射导弹/检测四个方向键,移动战机if(GetKey(VK_UP)=1) m_pMe->SetVerMotion(1); if(GetKey(VK_D
18、OWN)=1)m_pMe->SetVerMotion(-1);if(GetKey(VK_RIGHT)=1)m_pMe->SetHorMotion(1);if(GetKey(VK_LEFT)=1)m_pMe->SetHorMotion(-1);/产生战机导弹if(GetKey(VK_SPACE)=1)/按下了空格键CBomb *cbo1=new CBomb(pDoc->m_pMe->m_ptPos.x+10,pDoc->m_pMe->m_ptPos.y,1); pDoc->
19、;m_ObListBomb.AddTail(cbo1); CBomb *cbo2=new CBomb(pDoc->m_pMe->m_ptPos.x+30,pDoc->m_pMe->m_ptPos.y,1); pDoc->m_ObListBomb.AddTail(cbo2);4.6敌机发射炮弹/敌机发射子弹CPoint PlanePt = m_pMe->GetPoint(); /获取我方战机方位for(POSITION ePos=m_Ob
20、jListenEnemy.GetHeadPosition();ePos!=NULL;) CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos); if(!pEnemy->Fired() /如果敌机没处于发射状态,继续循环 continue; CPoint ePt = pEnemy->GetPoint(); /获取敌方战机方位 BOOL fa=FALSE; /标记是否发射 /敌机在战机前面 if(pEnemy->GetMontion()=1 && ePt.y<PlanePt.y) fa= TRUE;
21、 /敌机在战机后面 /if(pEnemy->GetMontion()=-1 && ePt.y>PlanePt.y)/ fa= TRUE; if(fa && ePt.x >= PlanePt.x && ePt.x<PlanePt.x+CMyPlane:PLANE_WIDTH) m_ObjListenBall.AddTail(new CBall(ePt.x+10,ePt.y+10,pEnemy->GetMontion(); 4.7碰撞检测及音效/敌机子弹炸掉战机POSITION bPos1=NULL,bPos2=NULL
22、;CRect mRect = m_pMe->GetRect();for(bPos1=m_ObjListenBall.GetHeadPosition();( bPos2 = bPos1 ) != NULL;)CBall* pBall = (CBall*)m_ObjListenBall.GetNext(bPos1);CRect bRect = pBall->GetRect();CRect tmpRect; if(tmpRect.IntersectRect(&bRect,mRect) /删除子弹 m_ObjListenBall.RemoveAt(bPos2); delete pB
23、all;/添加爆炸效果 m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top); PlaySound(TEXT("E:/飞机大战/plane/bang.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP);m_pMe->HP -= 10;if(m_pMe->HP <= 0) m_pMe->life-; m_pMe->HP = 100;if(m_pMe->life <= 0) /删除战机 delete m_pM
24、e; m_pMe=NULL; break; /撞机POSITION ePos1=NULL,ePos2=NULL;/用于记录敌我两级位置for(ePos1=m_ObjListenEnemy.GetHeadPosition();(ePos2=ePos1)!=NULL;)CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos1);CRect eRect = pEnemy->GetRect();CRect tmpRect;if(tmpRect.IntersectRect(eRect,mRect) /如果交不为空,则返回非零值;否则,如果交为
25、空则返回/删除敌机m_ObjListenEnemy.RemoveAt(ePos2);/从索引中删除delete pEnemy;/添加爆炸效果 m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top);PlaySound(TEXT("E:/飞机大战/plane/bang.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP);m_pMe->HP -= 20;if(m_pMe->HP <= 0) m_pMe->life-; m_pMe
26、->HP = 100; if(m_pMe->life <= 0) /删除战机 delete m_pMe; m_pMe=NULL; break; /还原子弹m_pMe->Bkind = 1; /添加爆炸效果 m_ObjListenExplosion.AddTail( new CExplosion(mRect.left,mRect.top) ); /删除敌机 m_ObjListenEnemy.RemoveAt(ePos2); delete pEnemy; POSITION baPos1=NULL,baPos2=NULL;for(baPos1=m_ObjListenBallA
27、.GetHeadPosition();(baPos2=baPos1)!=NULL;)CBallA* pBallA = (CBallA*)m_ObjListenBallA.GetNext(baPos1);CRect prRect = pBallA->GetRect();CRect tmpRect;/战机导弹炸掉敌机POSITION mPos1=NULL,mPos2=NULL;for(mPos1=m_ObjListenBomb.GetHeadPosition();(mPos2=mPos1)!=NULL;)CBomb* pBomb = (CBomb*)m_ObjListenBomb.GetNe
28、xt(mPos1);CRect bRect = pBomb->GetRect();POSITION ePos1=NULL,ePos2=NULL;for(ePos1=m_ObjListenEnemy.GetHeadPosition();(ePos2=ePos1)!=NULL;)CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos1);CRect mRect = pEnemy->GetRect();CRect tmpRect;if(tmpRect.IntersectRect(&bRect,mRect)m_pMe->
29、score += 10;/int x=m_pMe->level;if(m_pMe->score >= 1000*(m_pMe->level) /&& (m_pMe->level)%2 = 1m_pMe->level+;/添加爆炸效果m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top);PlaySound(TEXT("E:/飞机大战/plane/bang.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_NOS
30、TOP);/删除导弹if(m_pMe->Bkind != 2)m_ObjListenBomb.RemoveAt(mPos2);delete pBomb;/删除敌机m_ObjListenEnemy.RemoveAt(ePos2);delete pEnemy;break;另外还有敌机BOSS以及大招代码:if (nIDEvent=2)/敌机BOSS发射炮弹检测POSITION Ie1 = NULL, Ie2 = NULL;Ie1 = m_ObjListIenEnemy.GetHeadPosition();while (Ie2 = Ie1) != NULL)CIenemy *pIenemy = (CIenemy *) m_ObjListIenEnemy.GetNext(Ie1);for (int i = -15; i <= 15; i+) m_ObjListBall.AddTail(new CBall(pIenemy->GetPoint().x + 50
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 热敏电阻器制造工岗后测试考核试卷含答案
- 交换机务员安全实践水平考核试卷含答案
- 炼钢原料加工工标准化强化考核试卷含答案
- 煤制油生产工QC管理能力考核试卷含答案
- 棉胶液制备工安全专项评优考核试卷含答案
- 燃料值班员安全规程模拟考核试卷含答案
- 水生植物栽培工冲突管理强化考核试卷含答案
- 脂肪醇胺化操作工安全文明模拟考核试卷含答案
- 抽纱刺绣工岗后考核试卷含答案
- 2024年舟山市特岗教师招聘真题汇编附答案
- 8、中医科诊疗技术操作规范
- 江苏省高级人民法院劳动争议案件审理指南
- 夹套管施工方案
- 地面人工开挖施工方案
- 物业房屋中介合作协议
- 眼科常见疾病诊疗规范诊疗指南2022版
- 新郎父亲在婚礼上的精彩讲话稿范文(10篇)
- (山东)通风与空调工程施工资料表格大全(鲁TK001-057)
- 大鹏新区保护与发展综合规划(2013-2020)
- 战略成本1-6章toc经典案例
- DB37-T 5026-2022《居住建筑节能设计标准》
评论
0/150
提交评论