[cocos2d-x]例如C++的成员函数指针实现委托、监听者模式
来源:互联网 发布:淘宝种子新规 编辑:程序博客网 时间:2024/05/23 21:49
设计需求:
游戏结束后,通知需要监听“游戏结束”消息的对象发送通知。
开发unity3d中我们知道c#有默认的delegate实现委托event的事件,很简单,前面的我的文章有做一个较为详细的介绍委托,以及此模式的一些优点。
送上传送门回忆下: http://blog.csdn.net/chiuan/article/details/7918833
回归正题,我们直入正题,如何实现?
OK,可以google:“成员函数指针”相信大家会从中找到很多文章有涉及其介绍和使用。
1、先定义这个成员函数指针
typedef void (CCObject::*GAMEOVER_CALLBACK)();#define gameover_callback(_METHOD) (GAMEOVER_CALLBACK)(&_METHOD)
如上,定义一个是CCObject的返回void,传参为空的成员函数指针,命名为GAMEOVER_CALLBACK,因为指针是*,我们define一个宏处理,让输入的成员函数取其地址指针转化为函数指针。
2、定义引用成员函数指针的对象列表以及函数指针列表
CCArray* callbacksOfGameover;std::list<GAMEOVER_CALLBACK>* listOfGameover;
这里插一句补充,因为要调用这个成员函数方法,必须通过成员对象去调用。
3、实现监听者的3个方法,注册监听者、移除监听者、通知监听者
头文件定义:
bool registerObserverGameover(CCObject* obj,GAMEOVER_CALLBACK _method);bool removeObserverGameover(CCObject* obj);void notifyObserverGameover();
具体实现:
#pragma mark -#pragma mark delegate or notifycationbool GameLayer::registerObserverGameover(CCObject* obj,GAMEOVER_CALLBACK _method){ if (callbacksOfGameover && obj) { callbacksOfGameover->addObject(obj); //add method into vector. listOfGameover->push_back(_method); CCLOG("list of gameover size = %d",listOfGameover->size()); } else CCLOG("register observer gameover error. maybe obj == null."); return true;}bool GameLayer::removeObserverGameover(CCObject* obj){ if (callbacksOfGameover && obj && listOfGameover) { int index = callbacksOfGameover->indexOfObject(obj); callbacksOfGameover->removeObjectAtIndex(index); std::list<GAMEOVER_CALLBACK>::iterator iterator = listOfGameover->begin(); for (int count = 0; iterator != listOfGameover->end(); iterator++) { count+=1; if (index + 1 == count) { listOfGameover->erase(iterator); break; } CCLOG("iterator position = %d",count); } CCLOG("list of gameover size = %d",listOfGameover->size()); } else CCLOG("remove observer gameover error. maybe obj == null."); return true;}void GameLayer::notifyObserverGameover(){ std::list<GAMEOVER_CALLBACK>::iterator iterator = listOfGameover->begin(); for (int i = 0 ; iterator != listOfGameover->end() ; iterator++) { CCObject* obj = NULL; if(i < callbacksOfGameover->count()){ obj = callbacksOfGameover->objectAtIndex(i); } if (obj) { GAMEOVER_CALLBACK pCall = (GAMEOVER_CALLBACK)*iterator; (obj->*pCall)(); } i++; }}
暂时还没发现cocos2d-x里面用什么来记录这个函数指针列表,用了list,其实也可以用vector。
然后注意一点就是如何调用对象的成员函数指针,就相当于调用这个方法一样!
GAMEOVER_CALLBACK pCall = (GAMEOVER_CALLBACK)*iterator; (obj->*pCall)();
obj其实就是记录的某个对象,然后获取其成员函数指针pCall便可调用。其实这个很好理解,平时我们调用方法会是这样:
定义:void debug();
调用:debug();
那么把假如对象a里面的debug方法变成一个成员函数指针p调用:(a->*p)();
- [cocos2d-x]例如C++的成员函数指针实现委托、监听者模式
- [cocos2d-x]例如C++的成员函数指针实现委托、监听者模式
- cocos2d-x的成员函数指针
- cocos2d-x中函数回调 事件监听机制详细解析 涉及c++成员函数指针
- cocos2d-x系列笔记(9.2)---浅谈cocos2d-x使用函数指针实现委托(下)
- 成员函数指针与高性能的C 委托
- cocos2d-x系列笔记(9.1)---浅谈cocos2d-x使用函数指针实现委托(上)---通过c#代码理解委托
- 成员函数指针与高性能的C委托(中篇)
- C++委托实现(函数指针,function+bind,委托模式)
- Cocos2d-x 实现委托机制
- 成员函数指针与高性能的C++委托(上篇)
- 成员函数指针与高性能的C++委托(中篇)
- 成员函数指针与高性能的C++委托(下篇)
- 成员函数指针与高性能的C++委托
- 成员函数指针与高性能的C++委托
- 成员函数指针与高性能的C++委托
- 成员函数指针与高性能的C++委托
- 成员函数指针与高性能的C++委托
- IBatis下DAO单元测试另类思路
- LCD常见接口类型
- iBATIS测试类的详细写法
- 设置MYSQL数据库编码为UTF-8:
- iBATIS中的单元测试
- [cocos2d-x]例如C++的成员函数指针实现委托、监听者模式
- c++ 分割字符串,字符串转数组
- 盘点那些牛人是如何使用笔记本的,现在笔记本真是贱如白菜啊
- 明天看stringstream主要是相当与sprintf/sscanf函数的作用
- PHP扩展开发-06-变量的定义和使用
- js时间比较
- 张孝祥老师银行业务调度系统统视频学习
- JAVA设计模式学习总结
- Java 高质量编程建议(笔记7)