cocos2d-x游戏开发系列教程-超级玛丽08-消息机制
在超级玛丽游戏里,地图类CMGameMap负责所有的程序逻辑,它包含了背景地图,包含了游戏元素精灵,当游戏中的精灵之间发生碰撞时,比如马里奥撞上砖头这种事情发生时,马里奥对象本身不知道怎么处理这个逻辑,这个时候需要有一个机制,让马里奥通知地图对象,去处理这个游戏逻辑,这种通知机制,在cocos2dx中并没有提供。在马里奥游戏里,提供了这个机制,我认为值得好好学习。
一般说来,由于地图对象包含了所有的游戏元素,在面向对象设计时,地图类应该包容所有的游戏元素对象。由于游戏元素对象需要通知地图类,所以游戏元素类中,也要包容地图对象,这样形成了相互包含。在游戏元素繁多的情况下,这种相互引用导致代码耦合非常严重。
在马里奥的设计里,使用了一个CMReceiver类,这个类只有一个纯虚接口,这个纯虚接口就是接收消息
class CMReceiver
{
public:
virtual void OnMsgReceive(int enMsg,void* pData,int nSize) = 0;
};
在马里奥里,CMGameMap是由CMReceiver派生的。
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdwAAAATCAIAAAC1CCt3AAAC9klEQVR4nO2XUXLDMAhEff9Lqz9JqghYVrJik3bfdDIyRoAAY/doQgghynDcHYAQQohfNJSFEKIQGspCCFEIDWUhhCiEhrIQQhQiGcrH8fi7IpSO/nJY28tdfrdb3ktUCFCjkucYATlfrsXQS5HweKcFzZD2oY3TXs6eBYc0n5KdXNyKfI0+lJ+LE045uyCk4/3heS361Nu7G71bRwUBoRWOGuHWPVI4YxMI+98203XudjKwqYMU7M/LWnFhMrSltqlDiaEcZdCm/kO5Ltj0LhrKUwZJI8Pd2U8BPkIN5Xkv7GRof3Uov/77GE5kDxipWXlk833jhqF8PBkubR9bYdT0vE0cP9RxUoTXbjKjWgB3TPA4IVs0+7uMTTdO1wgWRndxM5DbyTDILOGQBjUQAKZgK0ancBMSnZ1vxVlJlH8cZ0q/v7lrfNkXiRQ6QcSpd3+xhT5HduMWTRx2r8BUYks+XT9M4YKQ2LOfFGKPdu1uTIuCq2Af1+EXeJ/y6Doa1lf2pxehs76xFfnJYC+theXULdtsk+P4saXbHCsFWR7ecuB9mAQxP5TtS8kK8cZUE9jEYc9yy5OQhZTMFDchWLPRc+1Mkr9rKEetOKwv689qrbgwlJtXNZAlrOnqRzVyt69UodscK3mjNr2VCru700PZ7opqE1UOO8I2cdizVHsS2seGsivBCkWGMjjvmaGMddKhvL0/q7XilqFMmgXpiorOZHvbUMYZ3FK5MQ66F9PU80N5WdOuo0MxJbnlSVgux+eE2HsL8om/a5jCVRjK1/dnkExnXbYVlxNyskOsa3JNMvh+/FlJKk/V8lCe9JetO7+95W7vAdt5R4O1YXt6IkLNz9JCkvtnBiuTwdvuXBa6qbMZBnI3n0C4EGdfaDeMKE4mcqDshmRdt3396ep8RSumNYqyBGxGwqhwL+/89vycr128qmhL7z3C5naT4p8y9/B7Q1ncjoowwcJLj7DJfi8IgeH7E38mi3tRBYQQohAaykIIUYgfZEJlxD9UOBoAAAAASUVORK5CYII=" alt="" />
这样CMGameMap需要去实现OnMsgReceive函数,在这个函数里实现消息处理。
而游戏元素都从另外一个类CMSender派生
class CMSender
{
protected:
CMReceiver* m_pReceiver;
public:
void SetReceiver(CMReceiver* pReceiver)
{
m_pReceiver = pReceiver;
}
void SendMsg(int enMsg,void* pData = NULL,int nSize = 0)
{
m_pReceiver->OnMsgReceive(enMsg,pData,nSize);
}
};
比如马里奥类就是从它派生的
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUkAAAAUCAIAAACPj1hiAAACSklEQVR4nO1Z7XLDIAzLS+4R85zsR3eMGlmYjzYplW63gmtso1iQ246UUkrpPM8kCMJGOB4f0rYgbAZpWxD2hLQtCHtC2haEPXF0Lzj+ft6Ao0A5NV9Bh4Fca4sfhkcvYX6mdsMhNI6RPPwsYmVfyRIhBPI5lm683EeQs0Is92TeSIqjHhtCifGjQTaxdn8eydAIHeLxl+NylmArwlWTSQcjmPlNtO1tTNpeuD/IVZN54hOPtgQXspQC2n5R3o4IZm60nd9wTKI6r+dW272YzwsXaLt+NSLL64zxN6uIW7nr7MvHkCKPYZKOlB00Znv5O9vr7R8FuCcp+84sJdp1nnPkNgpSRyL8+5h5qW0jyOcK3GlJfdAIyurpMGKE40hPN5+WcY4dAWDcyxLME3kcaNWstiFLcaOTCIzvxlJyCMlfkfarfcaoax+UPwWSr+1qY9hojkByWHLMazt/FTlW4cLmkl5c0rW0nrdqG95IKBEY342l5BACF8K9z1PXvnLMfFjbkHEShxe2RNtdl4a0TYzpmczJe7tVFRjfjaVsD2qbhx2jbpm2OS9LnoetzN9nRNvkTaaZLrikdIj07iVdO0yyZ5zXNgzFi78tS5Gue4XRjHHZZu79La22NO1Ntybq1xhDaOlQGs3y0sfEhG4we7POgBve+wB1ZX9z52Dx9dEGmczT4HISJDm8fQRLXtfBRvKW19F6qeONN/j/bWEAkR76NkBtC0sgIt+E+BXxJeCXtjCPPxZ1XQvCZpC2BWFPSNuCsCekbUHYE7/Bl5eNlexIDgAAAABJRU5ErkJggg==" alt="" />
在CMSender里,保存了一个CMReceiver对象,当有消息要通知CMReceiver时,只要调用CMReceiver对象的OnMsgReceive就行了。
这样做,相当于把CMGameMap的消息通知的功能抽象到另外一个类中,只是让消息通知这部分有耦合,其他的内容不耦合。
当马里奥对象需要通知CMGameMap时,调用它自己的CMReceiver对象的OnMsgReceive函数即可,而这个CMReceiver对象正好就是CMGameMap对象。
好吧,是不是很不好理解?如果被我猜中,那你得先复习下C++关于继承,虚函数等内容。
cocos2d-x游戏开发系列教程-超级玛丽08-消息机制的更多相关文章
- cocos2d-x游戏开发系列教程-超级玛丽10-怪物与马里奥冲突检测
在超级玛丽游戏中,马里奥在移动,怪物也在移动,当他们遇见时,需要判断是马里奥身亡还是怪物身亡. 这个判断的代码在怪物类的检测函数实现中. 比如蘑菇怪的冲突检测函数: bool CMMonsterMus ...
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap
背景 在上一篇博客中,我们提到CMGameScene,但是CMGameScene只是个框架,实际担任游戏逻辑的是CMGameMap类,这个博文就来了解下CMGameMap 头文件 class CMGa ...
- cocos2d-x游戏开发系列教程-超级玛丽06-CMGameScene
背景 在CMMenuScene中,当用户点击开始游戏时,导演让场景进入到CMGameScene 头文件 class CMGameScene : public cocos2d::CCLayer,publ ...
- cocos2d-x游戏开发系列教程-超级玛丽05-CMMenuScene
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 背景 上一篇博文提到appDelegate,在该类 ...
- cocos2d-x游戏开发系列教程-超级玛丽09-怪物激活与移动
在游戏中,很多怪物本身是会移动的,这里主要有蘑菇怪,乌龟等. 说起怪物的移动,首先在游戏里先要考虑怪物的抽象和设计. 在CMMonster.h中,有个类CMMonsterBasic,这个类抽象了所有的 ...
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(五)-地图卷动
马里奥在平移的过程中,涉及到地图的卷动问题. 在这个游戏里,地图比窗口大,窗口只是显示了地图的一部分,因此马里奥在移动的时候,移动到一定位置之后要卷动地图,否则马里奥移动到窗口右边之后......那结 ...
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(三)-按键处理
在地图初始化好了之后,就开始移动马里奥吧,我在windows下,是使用键盘来移动马里奥的 w是跳,d是前进,a是后退,那么在程序里是怎么来获取这个按键的呢? 普通的windows程序,在按键之后,会有 ...
- cocos2d-x游戏开发系列教程-超级玛丽04-AppDelegate
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 背景 上一篇博文提到在CCApplication: ...
- cocos2d-x游戏开发系列教程-超级玛丽02-代码结构
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 前景回顾 上一篇博文提到超级马里奥的游戏效果,大家 ...
随机推荐
- Windows环境下用C#编程将文件上传至阿里云OSS笔记
Windows环境下用C#编程将文件上传至阿里云OSS笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/detai ...
- 如何用LinkedHashMap实现LRU缓存算法
阿里巴巴笔试考到了LRU,一激动忘了怎么回事了..准备不充分啊.. 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的.LRU这个算法就是把最近一次 ...
- 实习生的Django[1]
尽管学期尚未结束,暑假尚未到来,可是大三的同学非常多已经和我一样開始实习或者实习一段时间了.我仅仅面试了一间数据挖掘的公司的研发部,还算顺利通过. 来这里实习后,由于网络原因,昨天没有刷题也没有写BL ...
- Android 标签控件
版本号:1.0 日期:2014.7.24 版权:© 2014 kince 转载注明出处 在有的应用中可能须要设置一些标签来方便用去去查询某些信息,比方手机助手或者购物软件之类都会有一些标签. ...
- CSS3新动画效果
CSS3添加了几个动画效果的属性,通过设置这些属性,可以做出一些简单的动画效果而不需要再去借助JavaScript.CSS3动画的属性主要分为三类:transform.transition以及anim ...
- VS C++工程类成员初始化检测脚本
最近项目中出现由类成员未初始化而进行读写而造成的问题,于是想将项目中所有的为初始化的地方找出来,优化一下代码,维护了这么多年的程序已有百万余行且VS2015还尚未支持检查类成员初始化的方法.,于是想写 ...
- [Swust OJ 838]--最优价值(0-1背包+数学)
题目链接:http://acm.swust.edu.cn/problem/838/ Time limit(ms): 1000 Memory limit(kb): 10000 Description 我 ...
- BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏( floyd )
直接floyd.. ---------------------------------------------------------------------------- #include<c ...
- zookeeper 数据存储特点
zookeeper 和elasticseaarch 数据存储特点: 1.zookeeper; [Zookeeper提供的一致性是弱一致性,首先数据的复制有如下规则:zookeeper确保对znode树 ...
- Uber选拔专车司机:五年以上驾驶经验 两小时视频培训
摘要:说起当时下流行打车软件Uber的司机,还得从春节前在上海一次打车说起.那几天,记者在上海某商场逛到打烊时间,大包小包拎着袋子根本腾不出手拦出租车,而商场门口的出租车临时停靠点更是挤满“血拼”而归 ...