版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、用手教“MFC版本蛇教程”。前面写的话此次蛇形教程的主要知识点如下1 CView类的消息响应2控件的消息响应3基于CView类的特定游戏实现4阵列5游戏图形实现使用CDC类实现。此游戏的特定实现在CViewl类中执行,因此不需要在其他类中添加代码。由于需要MFC的开发环境,请打开VisualC,创建新的MFC AppWizard单文档项目,然后随机命名项目。贪吃蛇的基本过程和一般思想1定义蛇和食物类,初始化出现在屏幕上的初始位置、长度、蛇行走方向等蛇贪吃成员变量。食品类的定义包括出现的初始位置,对食物是否被吃掉的判断。2个阵列初始化了长度为3的贪吃蛇,基本食物没有出现3 CView类使用MFC
2、提供的Windows消息中的WM_TIMER消息,并使用OnTimer()函数使系统提供用于游戏更新的时钟位4如果蛇打自己和墙,游戏结束,判断豆子是否被吃掉等具体的游戏实施包括随着蛇的长度的游戏难度变化等。5特定键盘游戏动作适用于Windows消息响应中的WM_KEYDOWN,并使用OnKeyDown()响应播放器的实际动作。/第一部分首先,在现有项目下的“ClassView”中,右键单击CView类,然后添加以下Windows信息1 WM_KEYDOWN2 WM_RBUTTONDOWN3dwm _ timer右键单击CView类,然后选择“添加虚拟函数”以选择OnInitialUpdate(
3、)OnInitialUpdate()的功能包括:视图窗格完全设置后,帧调用的第一个函数。框架在首次调用OnDraw之前调用oninitialshapdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式的最佳位置。由于两个项目在时间上的顺序不同,因此不会创建构造函数的原始成本类对象,而是创建OnCreate之后的窗口,然后创建视图的OnInitialUpDate。通常在此初始化视图的显示。简单的点,ONCREATE只是生成VIEW的基本结构和变量,OnInitialUpDate()主要初始化视图的控件等。每个变量的初始化操作所以我们要在贪图蛇的初始化工作中使用这个函数。
4、还添加成员函数oninit()进行贪图蛇的初始化控件的设计还有用于控制游戏开始、游戏结束和游戏暂停的游戏设计控件。单击工作区的资源视图可对其进行控制。其中,从Menu文件夹中删除“IDR_MAINFRAME”的所有基本控件右键单击标题栏并单击“属性”后,将显示菜单栏标题,每个菜单栏标题都将创建一个。在这里,我们各自制作“游戏”。在现有控件的列表中,单击属性,然后单击以设置菜单项属性。我们未设置的属性“标识”及其ID如下游戏开始IDM_START暂停游戏IDM_PAUSE继续游戏IDM_CONTINUE游戏结束IDM_EXIT其中控件的设计是“可显示”的控件操作成功设置ID后,右键单击用于创建消
5、息响应处理函数的属性具体方法操作的示例包括1右键单击“start game(开始游戏)”单击“2类向导设置”在“3 Message Maps”页面上,选择要对其执行邮件响应的控件ID列表Object IDs中的相应ID。在此处,选择CView类IDM_START。因此,必须将Class name的默认“CMainFrame”更改为“CView类”,然后在“Messages”类型设置中,将“COMMAND”设置为命令消息。其馀部分同样设置。Ps: windows消息分为三类:标准消息、命令消息和通知消息1除标准消息COMMAND外,WM_以标准消息开头2命令消息为COMMAND3通知消息控件生成
6、的消息,也可以显示为WM_COMMAND类型最后,我们返回到原始ClassView,然后查看我们添加的函数所有函数集合都具有以下内容在这里,您可以看到我们添加的Windows消息的所有消息响应函数的声明/第二部分具体来说,游戏,Step 1首先,在文件的开头分别定义蛇和食物的全局变量Struct SnakeInt x、y;Int lenInt direct蛇50;Struct Foodint x;int y;Int isfood Food再说了void cs nakeview :3360 oninitials update()c view : oninitialupdate();蛇形0。x=1
7、0蛇形0。y=10蛇形1。x=11蛇形1。y=10蛇形2。x=12蛇形2。y=10蛇形0。direct=3;蛇形0。len=3;food . is food=1;/todo : add your specialized code here and/or call the base class代码说明:初始化贪心的蛇最初有3个节点,长度为3,起始坐标;食物基本上是1无0。当然,我更喜欢0无1。Step 2将代码专门添加到OnKeyDown()中void cs nakeview 33603360 onkeydown(uint nchar,uint nre pcnt,uint n flags)/to
8、do : add your message handler code here and/or call default交换机(nChar)Case vk _ up : if (snake 0)。direct!=2)蛇0。direct=1;BreakCase vk _ down : if (snake 0)。direct!=1)蛇0。direct=2;BreakCase vk _ left : if (snake 0)。direct!=4)蛇0。direct=3;BreakCase vk _ right : if (snake 0)。direct!=3)蛇0。direct=4;Breakcvie
9、w 33603360 onkeydown(nchar、nre pcnt、n flags);cview 33603360 onkeydown(nchar、nre pcnt、n flags);OnKeyDown函数的第一个参数UINT nChar接收用户输入的信息,并使用switch进行判断代码说明:蛇0代表蛇的头,我们是蛇头的方向蛇0。(。判断direct。Case vk _ up : if (snake 0)。direct!=2)蛇0。direct=1;BreakSnake0。仅当direct的方向不等于“向下”时,才执行“向上”动作,否则忽略用户的“向上”动作键效果Step 3将代码专门添加
10、到OnRButtonDown()中void csnake view 33603360 onrbuttondown(uint n flags,cpoint point)/todo : add your message handler code here and/or call default/todo : add your message handler code here and/or call defaultCString strstr . format(“%d,% d”,point.x,point . y);AfxMessageBox(str);cview 33603360 onrbutt
11、ondown(n flags,point);cview 33603360 onrbuttondown(n flags,point);cview 33603360 onrbuttondown(n flags,point);此功能是右键单击屏幕时,立即显示当前位置的坐标信息。此函数不是必须添加到此游戏中的函数,以便您可以在游戏页面的后面使用鼠标右键屏幕获取近似的屏幕坐标信息这里补充一个知识点WIN32坐标系有三种1世界坐标系双页面坐标系3设备坐标系世界坐标系与页面坐标系名称“逻辑空间”相同,实际上与我们实际生活中的数学坐标系相同。否则,计算机屏幕是设备坐标系,其中用户区域窗口的左上角为(0,0)原
12、点,x坐标为正,y坐标为正。Step 4Void CSNAKEView:oninit()CDC * pDC=get DC();C brush drawbrush=(RGB (100,100,100);brush * draw brush=PDC-select object(draw brush);for(int I=0);I=蛇0。l-1;I)Pdc-rectangle (snake I)。x * 20,snake I。y * 20,(snake I)。x 1) * 20,(snake I)。y 1)* 20);PDC-select object(draw brush);代码说明:使用Wind
13、ows提供的CDC类绘制图片时,首先接受与窗口关联的DC句柄(指向CDC类的指针),然后使用定义的画笔创建DrawBrush对象,并将刷子颜色初始化为RGB(100,100,100)。使用SelectObject(DrawBrush),该函数在设备说明表中选择对象画笔,然后使用for循环绘制三个节点以探测蛇。Void far rectangle (int left,int top,int right,int bottom);此函数的功能是函数功能:此函数绘制矩形,并使用当前笔刷填充的当前笔划绘制矩形轮廓。Step 5控件添加代码Void csnakeview :3360 onstart()/t
14、odo : add your command handler code hereSetTimer(1,3000,空);AfxMessageBox(3秒后开始游戏!);Void csnakeview :3360 on pause()/todo : add your command handler code hereKillTimer(1);AfxMessageBox(“暂停游戏.”);Void CSNAKEView:OnExit()/todo : add your command handler code hereAfxMessageBox(“游戏结束.”);exit 0;void csnake
15、 view :3360 on continue()/todo : add your command handler code hereSetTimer(1,10,空);代码说明:由于您以前设置了WM_TIMER消息,因此可以使用计时器功能使用WM_TIMER设置计时器请看SetTimer API函数的原型UINT_PTR SetTimer(HWND hWnd,/窗口句柄您可以通过UINT_PTR nIDEvent、/计时器ID或多个计时器中的哪个计时器来确定UINT uElapse,/间隔,以毫秒为单位TIMERPROC lpTimerFunc /回调函数);SetTimer(m_hWnd,1
16、,1000,空);/每秒触发一次的计时器在MFC程序中,SetTimer封装在CWnd类中,无需在调用中指定窗口句柄因此,此处只能使用最后三个名为SetTimer(1,10,NULL)的参数。1000是1秒对AfxMessageBox的研究写在此博客上,此处不详细介绍在Step 6中为OnDraw()添加代码OnDraw()函数是众所周知的视图类的输出。视图类的输出默认由视图类的OnDraw函数处理,系统准备参数,然后调用OnDraw函数本人也不太研究子函数,只知道一点皮毛。但是,这与OnPaint()和OnDraw()之间的区别在于,on PAINT()派生自CWnd类以响应WM_PAINT消息。OnDraw是CView类的成员函数,没有消息响应功能,因此视图类中只有OnDraw(),没有OnPaint()。OnDraw()维护视
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化妆品追溯管理制度
- 防火门操作和维护保养规程
- 无人机知识竞赛考试题及答案
- 风电工程考核办法
- 屋顶风机检修规程
- 火电工程工作总结
- 2026年黑龙江省鸡西市网格员招聘考试参考题库及答案解析
- 2026年陕西省西安市网格员招聘考试备考试题及答案解析
- 2026年吉林省白城市网格员招聘考试参考题库及答案解析
- 高二班主任个人工作总结
- 招标代理机构选取服务方案投标文件(技术方案)
- 反制无人机课件
- 人力资源管理月度工作汇报
- DBJT15-82-2021 蒸压加气混凝土砌块自承重墙体技术规程
- (2025年标准)厂房协议委托租赁协议书
- 2024年长沙市口腔医院招聘真题
- 2025年云南省住院医师规范化培训结业理论考核(中医骨伤科)历年参考题库含答案详解(5卷)
- 地铁行车调度管理办法
- T/CECS 10210-2022给水用胶圈电熔双密封聚乙烯复合管材及管件
- 院前急救指南
- 骨干教师考试试题及答案
评论
0/150
提交评论