C++实训报告飞机大战.docx
- 文档编号:1606521
- 上传时间:2022-10-23
- 格式:DOCX
- 页数:59
- 大小:141.44KB
C++实训报告飞机大战.docx
《C++实训报告飞机大战.docx》由会员分享,可在线阅读,更多相关《C++实训报告飞机大战.docx(59页珍藏版)》请在冰豆网上搜索。
C++实训报告飞机大战
实训报告
飞机大战游戏设计与开发
高学凯
专业名称:
软件工程
班级:
12级2班
学号:
1201050907
信息科学与工程学院
二零一四年十月
1.概述
本次实训主要是做一个基于MFC的飞机大战游戏,其实现的主要功能为:
实现游戏对象的爆炸特效,文字提示功能和界面背景切换特效,其主要是遵循开发者规定的游戏规则进行游戏闯关。
主要的游戏主要角色:
战机、敌机、战机导弹、敌机子弹,战机用方向键控制移动,有十点生命值,被击中一次扣一点,有两种不同的武器:
子弹(“Z”键)和导弹(“X”键),子弹有三个等级,每个等级都有不同的发射效果,导弹只有一个等级但伤害高,武器有最大载弹量:
500发子弹和若干发导弹,敌机有三种:
普通敌机,中级敌机和Boss敌机,其中普通敌机包含上下两个方向出现的情况,中级敌机只能在上方出现但是血量高,Boss在第一关出现,有更加强大的火力。
对敌方造成一点伤害便获得一分,敌机的出现速度会根据得分的高低而发生变化,在游戏的过程中还会出现补给箱,可以增加子弹和导弹的弹药并获得一点生命值的奖励,“P”键可以暂停游戏,战机被击毁则可以选择退出或者重新开始。
2.相关技术
关键技术:
文字显示、贴图与透明特效、排序贴图实现爆炸动画、键盘消息响应、定时器的使用、双缓冲技术、碰撞检测技术、内存释放。
2.1文字显示
在CView类中建立函数Showinfornation();用来显示各项游戏信息;
voidCtest1View:
:
Showinformation()
{
Ctest1Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)
return;//获取CDoc类里的文件;
CClientDCDC(this);获取当前DC;
CRectrect;
this->GetClientRect(&rect);//获取屏幕大小;
if
(1)
{
CStringbuffer;
MemDC.SetTextColor(RGB(255,0,0));//用来初始化文字格式;
MemDC.SetBkMode(TRANSPARENT);//用来初始化文字显示方式;
buffer.Format(_T("得分:
%d"),pDoc->plan1.score);//初始化文本内容
MemDC.TextOutW(10,20,buffer);//输出文字;
//只列举得分的现实;
}
DC.BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);//绘制到缓冲图层;
}
2.2贴图与透明特效
intdraw(CDC*pDC)
{
CDCmemDC;//定义一个兼容DC
memDC.CreateCompatibleDC(pDC);//创建DC
CBitmapbmpDraw;//创建位图;
bmpDraw.LoadBitmap(IDB_PLANEME);//装入DDB
CBitmap*pbmpOld=memDC.SelectObject(&bmpDraw);//保存原有DDB,并选入新DDB入DC
pDC->TransparentBlt(pos.x-25,pos.y,50,60,&memDC,0,0,50,60,RGB(0,0,0));//使用该函数
memDC.SelectObject(pbmpOld);//选入原DDB
}
2.3排序贴图实现爆炸动画
以Cbaozha类为例,在Cbaozha类的头文件Cbaozha.h中:
定义静态变量:
staticCImageListimagelist;
定义函数:
staticintloadimage();//用来装载位图;
在cpp文件中:
intCbaozha:
:
loadimage()
{
//CRectrect;//
//GetClientRect(&rect);//
CBitmapbmp;
if(!
bmp.LoadBitmap(IDB_Baozha1))
return0;
if(!
imagelist.Create(66,66,ILC_COLOR24|ILC_MASK,8,0))//装载位图;
return0;
imagelist.Add(&bmp,RGB(0,0,0));
return0;
}
建立draw函数来绘制爆炸效果;
intCbaozha:
:
draw(CDC*pDC)
{
if(exist)
{
imagelist.Draw(pDC,index,pos,ILD_TRANSPARENT);//其中index用来表示绘制CImageList对象imagelist中图像链表中的第几张图片;
index=(index+1)%8;//爆炸动画共有8张图,顺序播放可实现动画效果;
}
return0;
}
CImageList链表中的图像显示在pDC这个句柄中。
ILD_TRANSPARENT表示是透明贴图。
其中主要就是CImageList图像列表。
它是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。
2.4键盘消息响应
用函数GetKeyState(VK_LEFT);可获取方向键左键的按键信息,若GetKeyState(VK_LEFT)<0则表示该键被按下,VK_LEFT为键盘的虚拟键值,其余按键可查虚拟键值表可得;
2.5定时器的使用
定时器告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。
通常有两种方法来实现:
发送WM_TIMER消息和调用应用程序定义的回调函数。
使用函数SetTimer(1,30,NULL);可设置一个定时器,代号为1,时间间隔为30毫秒。
2.6双缓冲技术
先创建一个内存DC,然后把画图都画在内存DC中,最后再一次性的将内存DC输出到窗口DC中,可以解决画面闪烁的问题。
首先在CView头文件中定义:
CDCMemDC;//定义一个显示设备对象;(双缓冲);
CBitmapMemBitmap;//定义一个位图对象;(双缓冲);
然后在cpp文件中初始化缓冲DC:
if(MemDC.m_hDC==NULL){
MemDC.CreateCompatibleDC(NULL);
CClientDCDC(this);
CRectrect;
this->GetClientRect(&rect);
//建立一个与屏幕显示兼容的位图;
MemBitmap.CreateCompatibleBitmap(&DC,rect.Width(),rect.Height());
MemDC.SelectObject(&MemBitmap);
}
从CView类添加消息WM_SIZE,在添加的OnSize函数中:
if(MemDC.m_hDC!
=NULL)
{
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
MemDC.CreateCompatibleDC(NULL);
CClientDCDC(this);
CRectrect;
this->GetClientRect(&rect);
//建立一个与屏幕显示兼容的位图;
MemBitmap.CreateCompatibleBitmap(&DC,rect.Width(),rect.Height());
MemDC.SelectObject(&MemBitmap);
即可使缓冲DC适应窗口的大小改变;
后续的对象在绘制的时候直接绘制到缓冲DC,如:
pDC->TransparentBlt(pos.x-25,pos.y,50,60,&memDC,0,0,50,60,RGB(0,0,0));//其中memDC为缓冲图层。
最后通过
DC.BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
绘制到屏幕;如果最后一个参数是SRCCOPY(Copiesthesourcebitmaptothedestinationbitmap)大概功能是位图的移动用。
它是将一幅位图从一个设备场景复制到另一个,源和目标DC相互间必须兼容。
2.7碰撞检测技术
对于每一个需要进行碰撞检测的对象都建立CRect对象用来表示它的碰撞范围,在绘制对象的时候用函数SetRect(rect,pos.x-25,pos.y,pos.x+25,pos.y+60);来确定碰撞范围的大小,其中rect为对象的CRect对象,pos为对象的位置。
然后建立函数:
boolCollisionDetection(CRectrect,CPointpoint)来判断一个CRect对象和一个CPoint点是否有交集,是则返回true,否则返回false。
重载函数boolCollisionDetectio(CRectrect1,CRectrect2)来判断两个CRect对象是否有交集,是则返回true,否则返回false。
boolCollisionDetection(CRectrect,CPointpoint)
{
if(point.x>=rect.left&&point.y>=rect.top&&point.x<=rect.right&&point.y<=rect.bottom)
returntrue;
else
returnfalse;
}
boolCollisionDetectio(CRectrect1,CRectrect2)
{
if((rect1&rect2).IsRectEmpty())
returnfalse;
elsereturntrue;
}
2.8CObList类
CObListm_ObjListball;//主要是定义一个CObList类的一个链表对象用于存储所有的此种相关的对象,易于后续的添加删除和提取数据。
POSITIONposball=NULL,posball_t=NULL;//定义指针
posball=pDoc->m_ObjListball.GetHeadPosition();//指针读取头结点
pDoc->pball=(Cball*)pDoc->m_ObjListball.GetNext(posball);//指针读取下一个结点
2.8内存释放
内存释放技术的实现主要是通过释放各个满足一定条件的对象和链表来实现的,pDoc->m_ObjListBomb.RemoveAt(mPos2);用于删除指针
deletepDoc->Bomb;用于删除对象
3.需求分析
●3.1功能需求分析
1、战机数量为1,战机的位置可通过键盘方向键进行控制。
可通过“Z”键控制战机发射子弹,可通过“X”键控制战机发射导弹,子弹有三个等级。
载弹量为0时不能发射武器,可通过补给箱补给。
同时有最大载弹量,不会超过一定数值。
2、敌机出现的时间和位置均为随机,敌机发射子弹的时间也是随机的,子弹的发射具有延时性。
敌机有三种:
普通敌机,中级敌机和Boss敌机,其中普通敌机包含上下两个方向出现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 报告 飞机 大战