MFC综合练习 开发自己的推箱子应用程序。

上传人:飞*** 文档编号:29226247 上传时间:2018-01-23 格式:DOC 页数:18 大小:40.07KB
返回 下载 相关 举报
MFC综合练习 开发自己的推箱子应用程序。_第1页
第1页 / 共18页
MFC综合练习 开发自己的推箱子应用程序。_第2页
第2页 / 共18页
MFC综合练习 开发自己的推箱子应用程序。_第3页
第3页 / 共18页
MFC综合练习 开发自己的推箱子应用程序。_第4页
第4页 / 共18页
MFC综合练习 开发自己的推箱子应用程序。_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《MFC综合练习 开发自己的推箱子应用程序。》由会员分享,可在线阅读,更多相关《MFC综合练习 开发自己的推箱子应用程序。(18页珍藏版)》请在金锄头文库上搜索。

1、MFC综合练习 开发自己的推箱子应用程序。MFC综合练习:开发自己的推箱子应用程序。2011-06-05 14:07这是我为了完成这个学期C+课程设计而做的作业,虽说无法达到老师的要求,但是通过这次练习,确实让我获益匪浅。应用的主要技术有:MFC位图操作(双缓存机制)MFC文档读写操作(通过Serialize()虚函数实现)MFC全屏显示功能MFC键盘处理机制。等。这是一个单文档MFC应用程序,主界面如下:地图是我随机生成的,所以有极大的问题,本想加入地图编辑功能,但是快考试没多少时间了,只好作罢。一、准备工作:新建MFC单文档应用程序BOX,添加两个枚举类型到BOXDoc.h enum Bo

2、xDirectB_UP,B_DOWN,B_LEFT,B_RIGHT;/表示人物移动的方向enum BoxMapM_NONE,M_WALL,M_DEST;/地图信息标志将所应用到得所有图片资源添加到资源中,ID分别为IDB_BOX、IDB_DEST、IDB_NONE、IDB_PEOPLE、IDB_WALL。VIEW类负责绘图工作,所以所有和绘图相关的变量都放在BOXView类里:CBitmap bitmap1,bitmap2,bitmap3,bitmap4,bitmap5;/位图资源CDC DCBox,DCPeople,DCDest,DCNone,DCWall;/代表内存设备资源CSize so

3、urce1,source2,source3,source4,source5;/分别代表每个位图的尺寸。二、关于游戏信息类的设计。我把它取名为CMap,最初的用意是表示地图,后来陆续又加上各种信息在里面,虽然这个名字不合适,但沿用旧名比较好。class CMap:public CObject public:int*Map;/地图信息CPoint People_Position;/人物的位置信息CPoint*Box_Position;/箱子的位置信息int M;/M、N分别代表地图的列数行数。int N;int BOX_NUM;/代表箱子数目int REACH_BOX_NUM;/代表已推到目的地的

4、箱子的数目int TOTAL_STATUS;/代表总的关卡数int cur_status;/代表当前关卡数string*status_info;/每个关卡的地图都存放在不同的文件里,status_info代表存放每个地图的文件名称protected:DECLARE_SERIAL(CMap)/赋予该类文档读写能力public:BOOL Is_Move_Ok(int Direct);/判断是否可推BOOL Move_Up(void);/向上推BOOL Move_Down(void);BOOL Move_Left(void);BOOL Move_Right(void);BOOL Is_Box(int

5、 i,int j);/(i,j)位置处是否为箱子CPoint*GetBoxPosition(int i,int j);/获取(i,j)处得箱子的内存地址,以便移动BOOL InitMap();/初始化地图BOOL DeleteMap();/删除当前地图,以便释放内存资源,供下次读取virtual void Serialize(CArchive&ar);/文档读写;在CBOXDoc类的声明中添加一个CMap对象CMyMap,还有两个函数:public:CMap MyMap;void Next_Status(int cur_status);/下一关inline CMap*GetMap()/获取当前

6、游戏信息return&MyMap;三、场景的绘制:首先初始化画图相关资源,在CBOXView类里面的OnInitialUpdate()函数里添加最合适:void CBOXView:OnInitialUpdate()CView:OnInitialUpdate();CClientDC pDC(this);BITMAP bm;bitmap1.LoadBitmap(IDB_BOX);DCBox.CreateCompatibleDC(&pDC);DCBox.SelectObject(&bitmap1);bitmap1.GetObject(sizeof(bm),&bm);source1.cx=bm.bmW

7、idth;source1.cy=bm.bmHeight;bitmap2.LoadBitmap(IDB_PEOPLE);DCPeople.CreateCompatibleDC(&pDC);DCPeople.SelectObject(&bitmap2);bitmap2.GetObject(sizeof(bm),&bm);source2.cx=bm.bmWidth;source2.cy=bm.bmHeight;bitmap3.LoadBitmap(IDB_WALL);DCWall.CreateCompatibleDC(&pDC);DCWall.SelectObject(&bitmap3);bitma

8、p3.GetObject(sizeof(bm),&bm);source3.cx=bm.bmWidth;source3.cy=bm.bmHeight;bitmap4.LoadBitmap(IDB_DEST);DCDest.CreateCompatibleDC(&pDC);DCDest.SelectObject(&bitmap4);bitmap4.GetObject(sizeof(bm),&bm);source4.cx=bm.bmWidth;source4.cy=bm.bmHeight;bitmap5.LoadBitmap(IDB_NONE);DCNone.CreateCompatibleDC(&

9、pDC);DCNone.SelectObject(&bitmap5);bitmap5.GetObject(sizeof(bm),&bm);source5.cx=bm.bmWidth;source5.cy=bm.bmHeight;当然在CBOXView类的析构函数里要是放这些资源:CBOXView:CBOXView()DCBox.DeleteDC();DCPeople.DeleteDC();DCDest.DeleteDC();DCNone.DeleteDC();DCWall.DeleteDC();bitmap1.DeleteObject();bitmap2.DeleteObject();bitm

10、ap3.DeleteObject();bitmap4.DeleteObject();bitmap5.DeleteObject();处理绘图的是CBOXView的OnDraw函数:void CBOXView:OnDraw(CDC*pDC)CBOXDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRect rect;GetClientRect(&rect);/取得整个窗口尺寸CMap*MyMap=pDoc-GetMap();/取得地图信息int Dest_Width=rect.Width()/MyMap-M;/计算显示每个位图资源的宽度和高度int Dest_H

11、eigth=rect.Height()/MyMap-N;int i=0,j=0;for(i=0;i MyMap-M;i+)for(j=0;j MyMap-N;j+)switch(*MyMap).Mapij)case M_NONE:pDC-StretchBlt(i*Dest_Width,j*Dest_Heigth,Dest_Width,Dest_Heigth,&DCNone,0,0,source1.cx,source1.cy,SRCCOPY);break;case M_WALL:pDC-StretchBlt(i*Dest_Width,j*Dest_Heigth,Dest_Width,Dest_H

12、eigth,&DCWall,0,0,source2.cx,source2.cy,SRCCOPY);break;case M_DEST:pDC-StretchBlt(i*Dest_Width,j*Dest_Heigth,Dest_Width,Dest_Heigth,&DCDest,0,0,source3.cx,source3.cy,SRCCOPY);break;for(i=0;i MyMap-BOX_NUM;i+)/绘制箱子pDC-StretchBlt(*MyMap).Box_Positioni.x*Dest_Width,(*MyMap).Box_Positioni.y*Dest_Heigth,

13、Dest_Width,Dest_Heigth,&DCBox,0,0,source4.cx,source4.cy,SRCCOPY);/绘制人物pDC-StretchBlt(*MyMap).People_Position.x*Dest_Width,(*MyMap).People_Position.y*Dest_Heigth,Dest_Width,Dest_Heigth,&DCPeople,0,0,source5.cx,source5.cy,SRCCOPY);if(MyMap-REACH_BOX_NUM=MyMap-BOX_NUM)/判断本关是否结束。MessageBox(你很强,你赢了!,You

14、Got it!,MB_OK);MyMap-cur_status+;/代表当前关卡的变量自动+1 MyMap-DeleteMap();pDoc-Next_Status(MyMap-cur_status);Invalidate(TRUE);四、文档的读写绘制地图的前提是已经从文件中读取到了地图信息,文件读取采用MFC的Serialize()函数,代表地图的文件内容如下(采用TDump工具查看内容):第一行的08 00 00 00 04 00 00 00 02 00 00 00 01 00 00 00其中08、04代表地图有八列四行。绘制出的信息如下:有两个箱子。以下列出CBoxDoc和CMAP类的

15、Serialize()函数IMPLEMENT_SERIAL(CMap,CObject,1);void CBOXDoc:Serialize(CArchive&ar)if(ar.IsStoring()MyMap.Serialize(ar);else MyMap.Serialize(ar);void CMap:Serialize(CArchive&ar)if(ar.IsStoring()/保存地图ar M;ar N;ar BOX_NUM;int i,j;for(i=0;i M;i+)for(j=0;j N;j+)ar Mapij;ar People_Position;for(i=0;i BOX_NU

16、M;i+)ar Box_Positioni;else/读取地图ar M;/读行列值ar N;ar BOX_NUM;/读取箱子数目InitMap();/给存放地图信息的变量分配内存空间int i,j;for(i=0;i M;i+)for(j=0;j N;j+)ar Mapij;ar People_Position;for(i=0;i BOX_NUM;i+)ar Box_Positioni;为了保证一打开游戏就有得玩,必须在CBOXDoc的构造函数里初始化地图信息:CBOXDoc:CBOXDoc()MyMap.cur_status=0;ifstream readinfo(Status.info);readinfo MyMap.TOTAL_STATUS;MyMap.status_info=new stringMyMap.TOTAL_S

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号