版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录1. 概述 .2. 相关技术 .2.1 碰撞检测 .2.2 CObList链表 .2.3 设置定时器 .2.4 背景滚动技术 .2.5 内存释放技术 .3. 总体设计与详细设计.3.1 系统模块划分 .3.2 主要功能模块 .4. 编码实现65. 实训中遇到的主要问题及解决方法496. 实训体会501. 概述这次实训,目的以VS 为环境,利用 MFC,使用 C+ 语言编写一个简单的飞机大战游戏 。实现的主要功能:1. 有开始游戏界面,上下左右键控制飞机自由移动,空格键发射炮弹。2. 设有关卡,每打完一个 boss就会过关,每过一关战机炮弹会升级,敌机随机发射子弹数量增加。3. 战机起始十条
2、命,可以通过过关和吃到道具增加血量。4. 战机子弹打中敌机, 敌机就会爆炸, boss血量随关卡升高而增多, 打败敌机或者 boss会有分数加成。5. 设有无敌模式和普通模式,无敌模式大招无限,生命无限,战机导弹直接升至最高等级。2. 相关技术2.1 碰撞检测用 CRect类的 GetRect()函数可以获得当前对象的矩形区域 , IntersectRect()并用此函数判断二者是否碰撞。2.2 CObList 链表这个程序使用CObList 链表来存储各效果。 CobList 类似于一个双向链表,POSITION类型的变量为链表的键。使用POSITION 变量,既可以作为链表循环中的循环变量
3、,也可以作为标记某个位置的标签。我们可以通过获得某元素的POSITION 来访问它。本程序中主要用到的函数有:GetHeadPosition():获取链表首元素的POSITION ;AddTail():将新的元素添加到链表最后;GetNext( POSITION& rPosition ) :使 rPosition 指向下一个元素。2.3 设置定时器SetTimer()函数来设置定时器。2.4 背景滚动为了让游戏场景更加逼真,游戏节奏更加合理,可以通过让背景滚动来提高游戏的场景效应,实现这一技术时,可以将一张背景图片复制为2 张,从上到下连续的拼接在一起,使其不会出现图片的卡顿和瞬移现象
4、。2.5 内存释放技术这个程序中有大量的地方需要使用内存,如果不及时删除会出现闪图等情况,容易导致程序崩溃,要及时释放内存资源。3. 总体设计与详细设计3.1 系统模块划分游 戏 系3.2 主要功能模块玩游关敌玩家控制模机家戏卡生类关系图:敌战Boss4. 编码实现机机死过过亡/ PlaneGameView.cpp : CPlaneGameView类的实现关关进void CPlaneGameView:UpdateFrame(CDC* pMemDC)/ 绘制天空if(level=0)战 机敌 机每 关碰 到或 者只 有导 弹战 机一 个CPaintDC dc(this);血 量boss或 者CB
5、itmapbmpBackground;/ 位图对象bmpBackground.LoadBitmap(IDB_BITMAP1);CDCdcMem;/ 定义一个工具箱(设备上下文)dcMem.CreateCompatibleDC(&dc);BITMAPbitmap;bmpBackground.GetBitmap(&bitmap); / 建立绑定关系CBitmap*back = dcMem.SelectObject(&bmpBackground);/ 保存原有 CDC 对象,并选入新 CDC 对象入 DCstatic int curr = 1;if (curr <= 1
6、)curr = GAME_HEIGHT - 1;curr -= 1;pMemDC->BitBlt(0, 0, GAME_WIDTH,GAME_HEIGHT- curr, &dcMem, 0, curr,SRCCOPY);pMemDC->BitBlt(0, GAME_HEIGHT- curr, GAME_WIDTH,curr, &dcMem, 0, 0,SRCCOPY);if(level>=1&&l=0&&boss=0)pMemDC->FillSolidRect(0, 0, GAME_WIDTH, GAME_HEIGHT,
7、RGB(0, 0, 0);l+;z=1;if(level=1&&l!=0&&boss!=0)CPaintDC dc(this);CBitmapbmpBackground;/ 位图对象bmpBackground.LoadBitmap(IDB_BITMAP1);CDCdcMem;/ 定义一个工具箱(设备上下文)dcMem.CreateCompatibleDC(&dc);BITMAPbitmap;bmpBackground.GetBitmap(&bitmap); / 建立绑定关系CBitmap*back = dcMem.SelectObject(&am
8、p;bmpBackground); / 保存原有 CDC 对象,并选入新 CDC 对象入 DCstatic int curr = 1;if (curr <= 1)curr = GAME_HEIGHT - 1;curr -= 1;pMemDC->BitBlt(0,0, GAME_WIDTH,GAME_HEIGHT-curr, &dcMem,0, curr,SRCCOPY);pMemDC->BitBlt(0,GAME_HEIGHT-curr, GAME_WIDTH,curr, &dcMem, 0, 0,SRCCOPY);if (level = 2 &&am
9、p; l != 0 && boss != 0)CPaintDC dc(this);CBitmapbmpBackground;/ 位图对象bmpBackground.LoadBitmap(IDB_MAP2);CDCdcMem;/ 定义一个工具箱(设备上下文)dcMem.CreateCompatibleDC(&dc);BITMAPbitmap;bmpBackground.GetBitmap(&bitmap); / 建立绑定关系CBitmap*back = dcMem.SelectObject(&bmpBackground);/ 保存原有 CDC 对象,并选入
10、新 CDC 对象入 DCstatic int curr = 1;if (curr <= 1)curr = GAME_HEIGHT - 1;curr -= 1;pMemDC->BitBlt(0, 0, GAME_WIDTH,GAME_HEIGHT- curr, &dcMem, 0, curr,SRCCOPY);pMemDC->BitBlt(0, GAME_HEIGHT- curr, GAME_WIDTH,curr, &dcMem, 0, 0,SRCCOPY);if(level=3 && l != 0 && boss != 0)CP
11、aintDC dc(this);CBitmapbmpBackground;/ 位图对象bmpBackground.LoadBitmap(IDB_MAP3);CDCdcMem;/ 定义一个工具箱(设备上下文)dcMem.CreateCompatibleDC(&dc);BITMAPbitmap;bmpBackground.GetBitmap(&bitmap); / 建立绑定关系CBitmap*back = dcMem.SelectObject(&bmpBackground);/ 保存原有 CDC 对象,并选入新 CDC 对象入 DCstatic int curr = 1;i
12、f (curr <= 1)curr = GAME_HEIGHT - 1;curr -= 1;pMemDC->BitBlt(0, 0, GAME_WIDTH,GAME_HEIGHT- curr, &dcMem, 0, curr,SRCCOPY);pMemDC->BitBlt(0, GAME_HEIGHT- curr, GAME_WIDTH,curr, &dcMem, 0, 0,SRCCOPY);if(level=4 && l != 0 && boss != 0)CPaintDC dc(this);CBitmapbmpBackgro
13、und;/ 位图对象bmpBackground.LoadBitmap(IDB_MAP4);CDCdcMem;/ 定义一个工具箱(设备上下文)dcMem.CreateCompatibleDC(&dc);/兼容BITMAPbitmap;bmpBackground.GetBitmap(&bitmap); / 建立绑定关系CBitmap*back = dcMem.SelectObject(&bmpBackground);/ 保存原有 CDC 对象,并选入新 CDC 对象入 DCstatic int curr = 1;if (curr <= 1)curr = GAME_HE
14、IGHT - 1;curr -= 1;pMemDC->BitBlt(0, 0, GAME_WIDTH,GAME_HEIGHT- curr, &dcMem, 0, curr,SRCCOPY);pMemDC->BitBlt(0, GAME_HEIGHT- curr, GAME_WIDTH,curr, &dcMem, 0, 0,SRCCOPY);if(level=5 && l != 0 && boss != 0)CPaintDC dc(this);CBitmapbmpBackground;/ 位图对象bmpBackground.LoadBi
15、tmap(IDB_MAP5);CDCdcMem;/ 定义一个工具箱(设备上下文)dcMem.CreateCompatibleDC(&dc);BITMAPbitmap;bmpBackground.GetBitmap(&bitmap); / 建立绑定关系CBitmap*back = dcMem.SelectObject(&bmpBackground);/ 保存原有 CDC 对象,并选入新 CDC 对象入 DCstatic int curr = 1;if (curr <= 1)curr = GAME_HEIGHT - 1;curr -= 1;pMemDC->Bit
16、Blt(0, 0, GAME_WIDTH,GAME_HEIGHT- curr, &dcMem, 0, curr,SRCCOPY);pMemDC->BitBlt(0, GAME_HEIGHT- curr, GAME_WIDTH,curr, &dcMem, 0, 0,SRCCOPY);if(level>5 && l != 0 && boss != 0)CPaintDC dc(this);CBitmapbmpBackground;/ 位图对象bmpBackground.LoadBitmap(IDB_MAP6);CDCdcMem;/ 定义一个
17、工具箱(设备上下文)dcMem.CreateCompatibleDC(&dc);BITMAPbitmap;bmpBackground.GetBitmap(&bitmap); / 建立绑定关系CBitmap*back = dcMem.SelectObject(&bmpBackground);/ 保存原有 CDC 对象,并选入新 CDC 对象入 DCstatic int curr = 1;if (curr <= 1)curr = GAME_HEIGHT - 1;curr -= 1;pMemDC->BitBlt(0, 0, GAME_WIDTH,GAME_HEIG
18、HT- curr, &dcMem, 0, curr,SRCCOPY);pMemDC->BitBlt(0, GAME_HEIGHT- curr, GAME_WIDTH,curr, &dcMem, 0, 0,SRCCOPY);pMemDC->SetBkMode(TRANSPARENT);pMemDC->SetTextAlign(TA_CENTER);pMemDC->SetTextColor(RGB(255, 255, 255);if(level=0)wchar_t S81000;wsprintf(S8, L"单击鼠标进入游戏 ");pMe
19、mDC->TextOutW(GAME_WIDTH / 2, GAME_HEIGHT / 2, CString(S8);if(level>=1&&z!=0)wchar_t S91000;wsprintf(S9, L"点击进入下一关 ");pMemDC->TextOutW(GAME_WIDTH / 2, GAME_HEIGHT / 2, CString(S9);if(level>=1&&z=0)wchar_t S11000;wchar_t S21000;wsprintf(S1, L"得分: %d", n
20、umber);wsprintf(S2, L"关卡: %d", level);pMemDC->TextOutW(35, 0, CString(S1);pMemDC->TextOutW(200, 0, CString(S2);wchar_t S31000;wsprintf(S3 , L"按下“ F1”开启无敌模式 ");pMemDC->TextOutW(390, 0, CString(S3);wchar_t S41000;wsprintf(S4, L"按下“ F2”关闭无敌模式 ");pMemDC->TextOut
21、W(390, 20, CString(S4);wchar_t S51000;if(wu=0) wsprintf(S5, L"大招数量 :%d",dazhao ); pMemDC->TextOutW(430, 40, CString(S5); if(wu=1)wsprintf(S5, L"大招数量 :无限 "); pMemDC->TextOutW(430, 40, CString(S5);wchar_t S61000;wsprintf(S6, L"按下空格发射子弹 ");pMemDC->TextOutW(60, 50,
22、 CString(S6);wchar_t S71000;wsprintf(S7, L"按下“ Z ”大招 ");pMemDC->TextOutW(56, 70, CString(S7);/ 绘制我方战机if (m_pMe != NULL)m_pMe->Draw(m_pMemDC, FALSE);else/Game OverCString str = _T("Game Over!");pMemDC->TextOut(GAME_WIDTH / 2, GAME_HEIGHT / 2, str);/ 绘制血条if (m_pMe != NULL)
23、CString z1;z1.Format(L"战机 HP( %d) ", shengming);pMemDC->TextOut(47, 30, z1);pMemDC->FillSolidRect(90, 33, shengming * 10, 10, RGB(255, 0, 0);if (bxt = 1)CString z2;z2.Format(L"Boss HP (%d)",boss);pMemDC->TextOut(35, 100, z2);pMemDC->FillSolidRect(80, 108, boss * 2, 10
24、, RGB(0, 255, 0);/ 绘制 导弹、爆炸、敌机、子弹、 boss、boss子弹for (int i = 0;i <= 8;i+)POSITION pos1, pos2;for (pos1 = m_ObjListi.GetHeadPosition(); (pos2 = pos1) != NULL; )CGameObject* pObj = (CGameObject*)m_ObjListi.GetNext(pos1);if (pObj && !pObj->Draw(pMemDC, FALSE)m_ObjListi.RemoveAt(pos2);delete
25、 pObj;/ 复制内存 DC 到设备 DCm_pDC->BitBlt(0, 0, GAME_WIDTH, GAME_HEIGHT, m_pMemDC, 0, 0, SRCCOPY);void CPlaneGameView:AI()static int nCreator = rand() % 5+20 ;/ 随机产生敌机if (nCreator <= 0)nCreator = rand() % 5 +20;m_ObjListenEnemy.AddTail(new CEnemy);nCreator-;/ 随机产生大招if (count % 30 = 0)m_ObjListendazh
26、ao.AddTail(new Cda);count+;/ 随机产生生命if (count % 40 = 0)m_ObjListenming.AddTail(new Cshengming);count+;/ 产生 bossif (level= 1&&bn=0&&count>=25&&count<=27)m_ObjListenboss.AddTail(new Cboss);bxt = 1;bn+;if (level= 2&&bn=0&&count>=50&&count<=52)m
27、_ObjListenboss.AddTail(new Cboss);bxt = 1;bn+;if (level = 3&&bn=0&&count>=75&&count<=77)m_ObjListenboss.AddTail(new Cboss);bxt = 1;bn+;if (level = 4&&bn=0&&count>=100&&count<=102)m_ObjListenboss.AddTail(new Cboss);bxt = 1;bn+;if (level = 5&
28、amp;&bn=0&&count>=150&&count<=152)m_ObjListenboss.AddTail(new Cboss);bxt = 1;bn+;if (level>5&&count%200=0&&bn=0)m_ObjListenboss.AddTail(new Cboss);bxt = 1;bn+;if (m_pMe = NULL)return;/ 检测四个方向键,移动战机for (int i = 0;i<4;i+)int nMeMotion = 0;m_pMe->SetVe
29、rMotion(0);m_pMe->SetHorMotion(0);nMeMotion = GetKey(VK_UP);if (nMeMotion = 1)m_pMe->SetVerMotion(1);nMeMotion = GetKey(VK_DOWN);if (nMeMotion = 1)m_pMe->SetVerMotion(-1);nMeMotion = GetKey(VK_RIGHT);if (nMeMotion = 1)m_pMe->SetHorMotion(1);nMeMotion = GetKey(VK_LEFT);if (nMeMotion = 1)m
30、_pMe->SetHorMotion(-1);/ 产生战机导弹if (GetKey(VK_SPACE) = 1)/ 按下了空格键if (m_pMe != NULL && m_pMe->Fired()CPoint pt = m_pMe->GetPoint();if (level = 1 && wu = 0)m_ObjListenBomb.AddTail(new CBomb(pt.x + 20, pt.y + 10);if (level = 2 && wu = 0)m_ObjListenBomb.AddTail(new CBomb(
31、pt.x + 10, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 30, pt.y + 30);if (level = 3 && wu = 0)m_ObjListenBomb.AddTail(new CBomb(pt.x + 10, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 30, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 20, pt.y + 30);if (level >= 4 &
32、;& wu = 0)m_ObjListenBomb.AddTail(new CBomb(pt.x + 10, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 30, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 20, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x , pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 40, pt.y + 30);if (wu = 1
33、)m_ObjListenBomb.AddTail(new CBomb(pt.x + 10, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 30, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 20, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x, pt.y + 30);m_ObjListenBomb.AddTail(new CBomb(pt.x + 40, pt.y + 30);if (GetKey(VK_F1) = 1)/
34、按下了 F1if (m_pMe != NULL && m_pMe->Fired()wu = 1;if (GetKey(VK_F2) = 1 && wu = 1)/按下了 F2if (m_pMe != NULL && m_pMe->Fired()wu = 0;/boss 发射子弹static int num = 100;if (m_pMe != NULL && num <= 0)for (POSITION ePos = m_ObjListenboss.GetHeadPosition(); ePos != NULL;
35、)Cboss* pEnemy = (Cboss*)m_ObjListenboss.GetNext(ePos);CPointePt = pEnemy->GetPoint();CBossball * t;for (int i = -level + 1; i <= level - 1; i+)t = new CBossball(ePt.x + 20, ePt.y + 30);t->zx = int(4.0*sin(3.14* double(i) / 9);t->zy = int(8.0*cos(3.14* double(i) / 9);m_ObjListenBossball.
36、AddTail(t);num = 100;num-;/ 敌机发射子弹if (m_pMe)CPoint PlanePt = m_pMe->GetPoint();for (POSITION ePos = m_ObjListenEnemy.GetHeadPosition(); ePos != NULL;)CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos);if (!pEnemy->Fired()continue;CPointePt = pEnemy->GetPoint();BOOL by = FALSE;/ 敌机在战机前
37、面if (pEnemy->GetMontion() = 1 && ePt.y<PlanePt.y)by = TRUE;/ 敌机在战机后面if (pEnemy->GetMontion() = -1 && ePt.y>PlanePt.y)by = TRUE;if (by && ePt.x >= PlanePt.x && ePt.x < PlanePt.x + CMyPlane:PLANE_WIDTH)CBall * t;for (int i = -level + 1; i <= level -
38、 1; i+)t = new CBall(ePt.x + 20, ePt.y + 30, -pEnemy->GetMontion();t->xx = int(8.0*sin(3.14* double(i) / 9);t->xy = int(8.0*cos(3.14* double(i) / 9);m_ObjListenBall.AddTail(t);/boss 子弹打到战机if (m_pMe != NULL)POSITION nPos3 = NULL, nPos4 = NULL;CRect mRect = m_pMe->GetRect();for (nPos3 = m_ObjListenBossball.GetHeadPosition(); (nPos4 = nPos3) != NULL;)CBall* pBall = (CBall*)m_ObjListenBossball.GetNext(nPos3);CRect bRect = pBall->GetRect();CRect tmpRect;if (tmpRect.IntersectRect(&bRect, mRect)/ 添加爆炸效果if (wu = 0 )shengming-;/ 生命减
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑业新质生产力路桥工程数字化建造
- 2025年工业元宇宙力反馈设备应用研究
- 新生儿动脉采血技巧
- 护理护理专业发展课件下载
- 2026年养老院康复器械委托合同协议
- 2026年伊春停热合同(1篇)
- 2026年自然人股合同(1篇)
- 出售旧房的协议书范本
- 合规风险管理实施专业方案李卓
- 甲亢患者生活质量提升护理
- 第4章复杂控制系统
- 2023年贵州省中考物理化学(理科综合)试卷真题
- 项目1动车组列车车内设备设施《高速铁路动车乘务实务》教学课件
- pcb板擦花防控措施
- 苗木采购投标方案
- 湖泊的水文特征
- 2022-2023学年云南省临沧市小学语文三年级下册期末提升试卷
- GB/T 21709.12-2009针灸技术操作规范第12部分:火针
- G-PACV-展开整体说明课件
- 寻根文学 (1)课件
- 铺轨专项方案
评论
0/150
提交评论