cocos2d-x自定义回调实现
来源:互联网 发布:社交网络头像 编辑:程序博客网 时间:2024/05/20 18:43
cocos2d-x项目中有时碰见需要注册回调函数,然后在合适的条件触发,有些类似android的广播消息。楼主项目中遇到的是网络数据处理,下面是主要的实现思路,希望能有些帮助。
private:
MessagePushEntry(const char* key,CCObject *target,SEL_MsgCallFuncO selector);
public:
~MessagePushEntry();
private:
#define MAX_KEY 256
char msgKey[MAX_KEY];
CCObject *target;
SEL_MsgCallFuncO selector;
public:
UT_hash_handle hh;
#define msgcallfuncO_selector(_SELECTOR) (SEL_MsgCallFuncO)(&_SELECTOR)
if(target==NULL)
return;
MessagePushEntry *pElement=NULL;
HASH_FIND_STR(m_messagePush,key.c_str(),pElement);
if(pElement==NULL){
target->retain();
pElement=new MessagePushEntry(key.c_str(),target,selector);
HASH_ADD_STR(m_messagePush,msgKey,pElement);
}
return;
MessagePushEntry *pElement=NULL;
HASH_FIND_STR(m_messagePush,onlyKey.c_str(),pElement);
if(NULL==pElement){
CCLOG("Message warn:no seletor");
return;
}
CCObject *myTarget=pElement->target;
SEL_MsgCallFuncO mySeletor=pElement->selector;
if(myTarget&& mySeletor){
(myTarget->*mySeletor)(msg);
}
HASH_DEL(m_messagePush,pElement);
pElement->target->release();
CC_SAFE_DELETE(pElement);
msg就是我们需要回调传的数据了,楼主这里传的是消息数据类,然后就等着处理回调函数吧。
有点需要注意,楼主没去做具体测试,但问题应该是存在的,注册回调后target会被retain()一次,所以如果注册了回调而没有触发应该会造成内存溢出。所以不用等回调直接退出时,需要在target的onExit()方法中去删除注册!
定义消息回调类MessagePushEntry,该类尽量遵循cocos2d-x的数据结构和规范,主要有回调对象,回调方法及用来遍历的链表数据结构。
private:
MessagePushEntry(const char* key,CCObject *target,SEL_MsgCallFuncO selector);
public:
~MessagePushEntry();
private:
#define MAX_KEY 256
char msgKey[MAX_KEY];
CCObject *target;
SEL_MsgCallFuncO selector;
public:
UT_hash_handle hh;
};
SEL_MsgCallFuncO是自己定义的一个回调宏,接受回调数据,msgKey是注册的过滤条件。
#define msgcallfuncO_selector(_SELECTOR) (SEL_MsgCallFuncO)(&_SELECTOR)
下面是注册回调
if(target==NULL)
return;
MessagePushEntry *pElement=NULL;
HASH_FIND_STR(m_messagePush,key.c_str(),pElement);
if(pElement==NULL){
target->retain();
pElement=new MessagePushEntry(key.c_str(),target,selector);
HASH_ADD_STR(m_messagePush,msgKey,pElement);
}
return;
}
上面这些就是注册回调的大致实现,然后就是在适当时候去触发回调。
MessagePushEntry *pElement=NULL;
HASH_FIND_STR(m_messagePush,onlyKey.c_str(),pElement);
if(NULL==pElement){
CCLOG("Message warn:no seletor");
return;
}
CCObject *myTarget=pElement->target;
SEL_MsgCallFuncO mySeletor=pElement->selector;
if(myTarget&& mySeletor){
(myTarget->*mySeletor)(msg);
}
HASH_DEL(m_messagePush,pElement);
pElement->target->release();
CC_SAFE_DELETE(pElement);
}
msg就是我们需要回调传的数据了,楼主这里传的是消息数据类,然后就等着处理回调函数吧。
有点需要注意,楼主没去做具体测试,但问题应该是存在的,注册回调后target会被retain()一次,所以如果注册了回调而没有触发应该会造成内存溢出。所以不用等回调直接退出时,需要在target的onExit()方法中去删除注册!
0 0
- cocos2d-x自定义回调实现
- Cocos2d-x 自定义动画
- Cocos2d-x 自定义动画
- cocos2d-x 自定义字体
- 【Cocos2d-x 011】 自定义动画 使用plist来实现
- Cocos2d-X中实现自定义菜单处理事件
- Cocos2d-JS 实现X轴自定义视窗跟随
- IOS游戏开发之cocos2d-x实现自定义字体
- Cocos2d-x:自定义动画 使用plist来实现
- [COCOS2D-X]裁剪实现
- cocos2d-x音效实现
- Cocos2d-x 实现时钟
- COCOS2D-X]裁剪实现
- cocos2d-x 画笔实现
- cocos2d-x 自定义一个场景
- Cocos2d-x--自定义血条
- cocos2d-x 自定义精灵类
- cocos2d-x 自定义精灵类
- 关于shape的一些属性
- java中复制文件的效率测试
- File:afx.inl Line:122
- android sip协议框架
- 单点登录
- cocos2d-x自定义回调实现
- Cadence 信号完整性(二)-- 电源完整性理论基础2
- 3912. 计算星期几 细心就好
- 江湖传言DNS挂了
- 关于冗余和viewstate
- 数学之路-群体行为与群体智能(4)
- Android 怎么退出整个应用程序?
- 8.生产者、消费者限定
- LS面试总结