MFC陨石撞飞机实验报告.docx
- 文档编号:10428578
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:14
- 大小:115.23KB
MFC陨石撞飞机实验报告.docx
《MFC陨石撞飞机实验报告.docx》由会员分享,可在线阅读,更多相关《MFC陨石撞飞机实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
MFC陨石撞飞机实验报告
一、题目
陨石撞飞机综合性实验
二、中文摘要
用MFC设计一个陨石撞飞机的平面游戏:
陨石不断地向下落,飞机通过上下左右键移动以躲避陨石。
当陨石碰撞了飞机时,显示提示对话框,及飞机爆炸图像。
确定后在碰撞位置重新开始游戏。
三次碰撞后显示提示对话框,游戏结束。
三、关键词
MFC、Bitmap、timer、键盘响应(WM_KEYDOWN)
四、前言
此程序大多代码出自参考资料,一小部分代码为搜索资料并加工完成,其功能尚有不完善之处。
五、软件开发过程
(一)、新建MFCAPPWizard[exe]单文档工程文件
在VisualC++中新建一个工程,命名为Plane。
工程类型为:
MFCAppWizard[exe]。
在MFCAppWizard-Step1对话框中设置应用程序的类型,建立一个单文档工程文件,得到一个应用程序框架文件。
(二)、添加资源:
、飞机位图、陨石位图、爆炸位图。
在[插入]-[资源…]选择Bitmap选项,单击[新建]即可。
绘出一个飞机,ID为(IDB_BITMAP1)、五个陨石(IDB_BITMAP2~IDB_BITMAP6)和一个炸弹位图(IDB_BITMAP7),如下图。
飞机位图陨石位图爆炸位图
(三)、在planeView.h头文件中声明所需变量和函数
CBitmapm_plane;//声明一个CBitmap类型的飞机变量m_plane
intmx,my;//表示飞机坐标
CBitmapm_bump;//爆炸位图变量
intmpx,mpy;//表示爆炸位图的坐标
intt;//爆炸次数
//声明陨石位图的成员变量为CBitmap类型的变量
CBitmapm_stone1,m_stone2,m_stone3,m_stone4,m_stone5;
//声明陨石的坐标变量为int类型:
intnstone1x,nstone1y;
intnstone2x,nstone2y;
intnstone3x,nstone3y;
intnstone4x,nstone4y;
intnstone5x,nstone5y;
再声明函数成员
voidCPlanView:
:
DrawPlane(CDC*pDC);//飞机位图函数
voidCPlanView:
:
Drawbump(CDC*pDC);//爆炸位图函数
//声明绘制陨石的函数原型:
voidDrawStone1(CDC*pDC);
voidDrawStone2(CDC*pDC);
voidDrawStone3(CDC*pDC);
voidDrawStone4(CDC*pDC);
voidDrawStone5(CDC*pDC);
以上成员(数据成员、成员函数)均为public属性
(四)在planview.cpp文件中添加函数
1)、修改构造函数
mx=100;my=100;t=0;//赋初值
m_plane.LoadBitmap(IDB_BITMAP1);//飞机位图调用
m_bomb.LoadBitmap(IDB_BITMAP7);//爆炸位图调用
//添加陨石初始化操作代码,随机产生
nstone1x=rand()%500;//陨石1x方向随机数0~499
nstone1y=10;
m_stone1.LoadBitmap(IDB_BITMAP2);
nstone2x=rand()%500;//陨石2x方向随机数0~499
nstone2y=10;
m_stone2.LoadBitmap(IDB_BITMAP3);
nstone3x=rand()%500;//陨石3x方向随机数0~499
nstone3y=10;
m_stone3.LoadBitmap(IDB_BITMAP4);
nstone4x=rand()%500;//陨石4x方向随机数0~499
nstone4y=10;
m_stone4.LoadBitmap(IDB_BITMAP5);
nstone5x=rand()%500;//陨石5x方向随机数0~499
nstone5y=10;
m_stone5.LoadBitmap(IDB_BITMAP6);
2)、修改ondraw()函数
添加DrawPlane(pDC);//调用绘制飞机函数
3)、添加DrawPlane()和Drawbump()函数
voidCPlaneView:
:
DrawPlane(CDC*pDC)
{
CDCMemDC;
MemDC.CreateCompatibleDC(pDC);
BITMAPbm;
m_plane.GetObject(sizeof(BITMAP),&bm);
CBitmapMemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);
CBitmap*pOldBitmap;
pOldBitmap=(CBitmap*)MemDC.SelectObject(&MemBitmap);
MemDC.SelectObject(&m_plane);
pDC->BitBlt(mx,my,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
}
Drawbump()函数如上类似。
4)添加键盘响应处理函数(OnkeyDown)
①添加函数,使飞机能随用户按下的上下左右方向键而移动。
在菜单中选择View->ClassWizard,选中CPlaneView类,在MessageMaps选项卡中的Messages栏目选择WM_KEYDOWN消息,双击该项,系统自动生成onKeyDown消息处理函数.
②在PlaneView.cpp文件中,在系统自动产生的函数框架里添加如下所示代码:
CClientDCClientDC(this);
RECTrect;
BITMAPbm;
m_plane.GetObject(sizeof(BITMAP),&bm);
rect.left=mx;
rect.top=my;
rect.right=rect.left+bm.bmWidth;
rect.bottom=rect.top+bm.bmHeight;
CBrushbrush(GetSysColor(COLOR_WINDOW));//擦去原来的飞机图像
ClientDC.FillRect(&rect,&brush);
if(nChar==VK_UP)//按键盘上的向上键"↑"
{my=my-8;}
if(nChar==VK_LEFT)//按键盘上的向上键"←"
{mx=mx-8;}
if(nChar==VK_RIGHT)//按键盘上的向上键"→"
{mx=mx+8;}
if(nChar==VK_DOWN)//按键盘上的向上键"↓"
{my=my+8;}
DrawPlane(&ClientDC);//重新绘制飞机图像
CView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
5)添加自定义的绘制陨石的函数DrawStone1
voidCPlaneView:
:
DrawStone1(CDC*pDC)
{
CDCMemDC;
MemDC.CreateCompatibleDC(pDC);
BITMAPbm1;
m_stone1.GetObject(sizeof(BITMAP),&bm1);
CBitmapMemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC,bm1.bmWidth,bm1.bmHeight);
CBitmap*pOldBitmap;
pOldBitmap=(CBitmap*)MemDC.SelectObject(&MemBitmap);
MemDC.SelectObject(&m_stone1);
pDC->BitBlt(nstone1x,nstone1y,bm1.bmWidth,bm1.bmHeight,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
}
其余函数DrawStone2、DrawStone3、DrawStone4、DrawStone5,类似如上的函数写法
6)为了实现陨石的自动下落运动,需要添加定时器函数来控制。
①选View|ClassWizard菜单项,在MFCClassWizard中,选择CPlaneView类,在MessageMaps选项卡中的Messages栏目选择WM_TIMER、WM_CREATE消息,分别双击该项,由系统自动生成该对应的消息函数。
②在OnCreate函数中添加:
SetTimer(1,200,NULL);//定时器
③在OnTimer函数中添加
CClientDCClientDC(this);
RECTClientRect;
GetClientRect(&ClientRect);
RECTrect1,rect2,rect3,rect4,rect5;
BITMAPbm;
m_stone1.GetObject(sizeof(BITMAP),&bm);
CBrushbrush(GetSysColor(COLOR_WINDOW));
intn=0,ns1,ns2,ns3,ns4,ns5;
n++;
ns1=nstone1x+n;
rect1.left=ns1-20;
rect1.top=nstone1y-20;
rect1.right=rect1.left+bm.bmWidth;
rect1.bottom=rect1.top+bm.bmHeight;
ClientDC.FillRect(&rect1,&brush);
nstone1y=nstone1y+10;//陨石1下落的速度
if(nstone1y>ClientRect.bottom)
{nstone1y=0;
nstone1x=rand()%ClientRect.right;//陨石落下的位置随机产生
}
陨石2至陨石5类似
if(n>3)
{n=0;}
DrawStone1(&ClientDC);
DrawStone2(&ClientDC);
DrawStone3(&ClientDC);
DrawStone4(&ClientDC);
DrawStone5(&ClientDC);
CView:
:
OnTimer(nIDEvent);
7)接着添加陨石撞上飞机时弹出提示的函数
if(t<3)//判断死亡次数
{
if(nstone1x>=mx-30&&nstone1x<=mx+20&&nstone1y>=my-30&&nstone1y<=my+20)//判断爆炸条件
{
mpx=mx;
mpy=my;
Drawbump(&ClientDC);//显示爆炸位图
KillTimer
(1);//停止计时器
MessageBox("死亡!
");//提示框显示死亡
nstone1y=0;
nstone1x=rand()%ClientRect.right;//重新产生被撞陨石
SetTimer(1,200,NULL);//开始计时器
t++;
}
}
else
{
t=0;
mpx=mx;
mpy=my;
Drawbump(&ClientDC);
MessageBox("GameOver!
PressOKtorestar!
","Notice");//超过3次死亡显示GameOver
}
if(t<3)//判断死亡次数
{
if(nstone2x>=mx-30&&nstone2x<=mx+20&&nstone2y>=my-30&&nstone2y<=my+20)//判断爆炸条件
{mpx=mx;
mpy=my;
Drawbump(&ClientDC);//显示爆炸位图
KillTimer
(1);//停止计时器
MessageBox("死亡!
");//提示框显示死亡
nstone2y=0;
nstone2x=rand()%ClientRect.right;//重新产生被撞陨石
SetTimer(1,200,NULL);//开始计时器
t++;
}
}
else
{
t=0;
mpx=mx;
mpy=my;
Drawbump(&ClientDC);
MessageBox("GameOver!
PressOKtorestar!
","Notice");//超过3次死亡显示GameOver
}
if(t<3)//判断死亡次数
{
if(nstone3x>=mx-30&&nstone3x<=mx+20&&nstone3y>=my-30&&nstone3y<=my+20)//判断爆炸条件
{mpx=mx;
mpy=my;
Drawbump(&ClientDC);//显示爆炸位图
KillTimer
(1);//停止计时器
MessageBox("死亡!
");//提示框显示死亡
nstone3y=0;
nstone3x=rand()%ClientRect.right;//重新产生被撞陨石
SetTimer(1,200,NULL);//开始计时器
t++;
}
}
else
{
t=0;
mpx=mx;
mpy=my;
Drawbump(&ClientDC);
MessageBox("GameOver!
PressOKtorestar!
","Notice");//超过3次死亡显示GameOver
}
if(t<3)//判断死亡次数
{
if(nstone4x>=mx-30&&nstone4x<=mx+20&&nstone4y>=my-30&&nstone4y<=my+20)//判断爆炸条件
{mpx=mx;
mpy=my;
Drawbump(&ClientDC);//显示爆炸位图
KillTimer
(1);//停止计时器
MessageBox("死亡!
");//提示框显示死亡
nstone4y=0;
nstone4x=rand()%ClientRect.right;//重新产生被撞陨石
SetTimer(1,200,NULL);//开始计时器
t++;
}
}
else
{
t=0;
mpx=mx;
mpy=my;
Drawbump(&ClientDC);
MessageBox("GameOver!
PressOKtorestar!
","Notice");//超过3次死亡显示GameOver
}
if(t<3)//判断死亡次数
{
if(nstone5x>=mx-30&&nstone5x<=mx+20&&nstone5y>=my-30&&nstone5y<=my+20)//判断爆炸条件
{mpx=mx;
mpy=my;
Drawbump(&ClientDC);//显示爆炸位图
KillTimer
(1);//停止计时器
MessageBox("死亡!
");//提示框显示死亡
nstone5y=0;
nstone5x=rand()%ClientRect.right;//重新产生被撞陨石
SetTimer(1,200,NULL);//开始计时器
t++;
}
}
else
{
t=0;
mpx=mx;
mpy=my;
Drawbump(&ClientDC);
MessageBox("GameOver!
PressOKtorestar!
","Notice");//超过3次死亡显示GameOver
}
程序结束
六、系统测试情况
基本完成实验要求,飞机可以键盘响应上下左右移动,撞上陨石有提示并能调出爆炸位图,超过三次碰撞提示游戏结束。
游戏截图如下:
七、系统优点与不足
优点:
可以实现碰撞时产生提示及爆炸图像
缺点:
不可以在游戏界面修改飞机速度和陨石下落速度
八、参考文献
1周霭如著.C++程序设计基础(第2版).北京:
电子工业出版社
2谭浩强著.C++面向对象程序设计.北京:
清华大学出版社
3谭浩强著.C++是程序设计.北京:
清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 陨石 飞机 实验 报告