程序设计综合实践 飞机大战 实训报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

[在此处键入]实训报告飞机大战游戏设计与开发专业名称:班级:学号:信息科学与工程学院二零一八年七月计算机科学与工程学院《程序设计综合实践》报告2目录1.概述........................................................................................................32.相关技术................................................................................................32.1碰撞检测.......................................................................................32.2COblist链表...................................................................................32.3双缓冲技术...................................................................................42.4背景滚动.......................................................................................42.5爆炸动画的实现...........................................................................42.6定时器的使用................................................................................43.总体设计与详细设计...........................................................................43.1系统模块划分...............................................................................43.2主要功能模块...............................................................................54.编码实现................................................................................................75.实训中遇到的主要问题及解决方法.................................................426.实训体会..............................................................................................43计算机科学与工程学院《程序设计综合实践》报告31.概述本次实训任务是以visualstudio2017为环境,利用MFC和C++编写一个飞机大战游戏。其实现的主要功能为:实现游戏对象的爆炸特效,界面背景切换,文字提示和血条显示功能,奖励机制(血包、护盾、僚机、武器升级),大招和无敌模式等。通过方向键控制战机移动,空格键发射子弹,击毁敌机可以得分。游戏中可以按“X”开启或关闭无敌模式。按“P”可以暂停。游戏设有能量槽,能量不断积累,超过一半可以按“Z”键使用大招,大招为全屏攻击。玩家收到攻击血量减少,血量为0游戏结束,显示“GameOver”,可以按“R”复活,继续游戏。游戏设有关卡机制,每关开始一段时间后出现boss。击败boss进入下一关。boss有三种,难度依次增加。第一种boss发射直线子弹,第二种boss发射散射子弹,第三种boss两种子弹随机发射。前三关背景图和boss固定,之后背景图与boss随机生成。游戏中随机出现四种道具:血包:可以恢复一定的血量。护盾:一段时间内无敌。武器升级:升级玩家的武器,共三个等级。僚机:获得一个僚机。2.相关技术2.1碰撞检测游戏中需要处理一系列的碰撞,在处理碰撞时,可以认为每个对象是与位图大小相同的矩形,用Crect类的GetRect函数获取我方战机的矩形与敌机子弹矩形,然后新建一个矩形并且调用IntersectRect(&bRect,mRect)再用if条件语句判断,若矩形区域重叠不为空,则视为碰撞,在if语句中填写实现碰撞后的功能。2.2COblist链表使用CObList链表来分别存储敌机,炸弹,导弹,爆炸等效果。CObList类支持非唯一的CObject指针,并可顺次访问或通过指针值访问有序列表。CObList列表的行为类似于双向链接列表,POSITION类型的变量为链表的键。使用POSITION变量,既可以作为列表循环中的循环变量,也可以作为标记某个位置的标签。我们用到的主要函数有:GetHeadPosition():返回列表中首元素的位置AddTail():在列表尾增加一个元素计算机科学与工程学院《程序设计综合实践》报告4GetNext():获取循环遍历中的下一个元素2.3双缓冲技术利用普通的绘制函数对项目中元素进行绘图时,由于绘图时机不一定连续,绘图效率不一定统一,会造成重影和闪屏的不良效果,为了解决这一问题,可以利用双缓冲技术。双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。可以在程序中定义一个CDC指针变量和CBitmap指针变量实现,在构造函数中为两个指针分配内存空间,将所有的图像绘制完毕后,再取得真实窗口CDC指针和BitBlt函数将内存中的内容完整的拷贝到屏幕上。2.4背景滚动为了让游戏场景更加逼真,游戏节奏更加合理,可以通过让背景滚动来提高游戏的场景效应,实现这一技术时,可以将一张背景图片复制为2张,从上到下连续的拼接在一起,使其不会出现图片的卡顿和瞬移现象。2.5爆炸动画的实现爆炸的特效是由一组静态图像连续绘制形成的,为了实现这一效果,可以利用MFC中的CImageList类,将一组由静态图像组成的连续位图按照一定格式转化为CImageList对象,并为每一个对象设置一个index,在需要爆炸的时候,根据index逐帧播放图像,实现敌机爆炸的动态效果。2.6定时器的使用为了实现屏幕的定时刷新和暂停功能,需要设置定时器,当设置好时间间隔时,每次经过一个设置的时间间隔,Windows都会向程序发送一个WM_TIMER,并且调用相关函数,程序执行OnTimer函数,并根据定时器编号执行相应的操作。实现方式为使用SetTimer函数设置定时器标识和时间间隔。另外也可以利用定时器实现对连续按键的处理,使子弹发射和移动效果更加平滑合理。3.总体设计与详细设计3.1系统模块划分主要由对象功能模块、游戏规则模块、系统功能模块组成。计算机科学与工程学院《程序设计综合实践》报告53.2主要功能模块对象功能模块:负责各个对象的定义,属性和特性的描述:对象的位置坐标,碰撞矩形或碰撞点,运动方式的算法,血量、类型等各种数值,对象是否存在的bool值。游戏规则模块:1、玩家的控制:检测键盘输入,实现战机的移动、攻击、大招等功能。2、随机产生敌机:敌机的位置、速度、子弹发射频率随机。3、奖励机制:随机出现四种奖励:血包、武器升级、护盾和僚机。4、分数机制:击毁敌机或boss获得分数。5、大招机制:能量不断积累,超过一半可以释放大招。6、BOSS规则:boss有3种,子弹有直线型和散射型两种。7、碰撞规则:战机、敌机、子弹和boss之间的碰撞,不同碰撞产生不同的结果。8、关卡机制:击败boss进入下一关。前三关boss及背景图固定,之后的关卡中,5种背景图和3种boss随机出现。系统功能模块:1、窗口控制:初始化一个默认大小的窗口作为游戏的主界面,去除默认自带的编辑栏。2、游戏开始时需要准备的工作:建立定时器,装载静态位图。3、绘制:背景,对象,文字信息。4、内存释放:在每一帧的结束清理不需要的对象以防止对象链表无限制增长。UML图如下:计算机科学与工程学院《程序设计综合实践》报告6计算机科学与工程学院《程序设计综合实践》报告74.编码实现//PlaneGameView.cpp:CPlaneGameView类的实现voidCPlaneGameView::UpdateFrame(CDC*pMemDC){//绘制天空pMemDC-FillSolidRect(0,0,GAME_WIDTH,GAME_HEIGHT,RGB(84,142,239));//背景CBitmapbitmap;//位图类对象if(selectbackground==1)bitmap.LoadBitmap(IDB_BACKGROUND1);//从资源中装载入位图elseif(selectbackground==2)bitmap.LoadBitmap(IDB_BACKGROUND2);elseif(selectbackground==3)bitmap.LoadBitmap(IDB_BACKGROUND3);elseif(selectbackground==4)bitmap.LoadBitmap(IDB_BACKGROUND4);elseif(selectbackground==5)bitmap.LoadBitmap(IDB_BACKGROUND5);//loadDCCDCcomdc;//创建CDC对象comdc.CreateCompatibleDC(m_pMemDC);//创建设备环境comdc.SelectObject(&bitmap);//选择位图对象//将兼容性DC的信息拷贝到当前DCCRectrect;GetWindowRect(&rect);ScreenToClient(&rect);//m_pMemDC-BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&comdc,0,0,SRCCOPY);m_pMemDC-BitBlt(0,0,GAME_WIDTH,scrolls,&comdc,0,GAME_HEIGHT-scrolls,SRCCOPY);m_pMemDC-BitBlt(0,scrolls,GAME_WIDTH,GAME_HEIGHT-scrolls,&comdc,0,0,SRCCOPY);if(scrolls=GAME_HEIGHT)//控制背景滚动scrolls+=6;else计算机科学与工程学院《程序设计综合实践》报告8scrolls=0;//绘制血条CStringhp;hp.Format(_T(HP:));pMemDC-SetBkMode(TRANSPARENT);pMemDC-SetTextAlign(TA_CENTER);pMemDC-SetTextColor(RGB(0,255,255));pMemDC-TextOut(20,30,hp);CBrushbr;//血条br.CreateSolidBrush(RGB(0,255,102));m_pMemDC-SelectObject(br);m_pMemDC-Rectangle(42,30,42+4*mylife,45);CBrushbr1;br1.CreateSolidBrush(RGB(0,0,0));m_pMemDC-SelectObject(br1);m_pMemDC-Rectangle(42+4*mylife,30,42+200,45);//

1 / 43
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功