cocos2dx3.0自定义回调函数,传递自己想要的参数
来源:互联网 发布:js继承是什么 编辑:程序博客网 时间:2024/05/17 01:43
近日,由于自己需要用到一个特效道具,show完特效后会删除场上几个同一类的精灵,为避免同时使用这两个道具时,产生冲突,导致前一个特效的精灵未被删除,所以想了个自定义回调函数的方法,众所周知,定义一个回调函数的用法大致是:
__String* draw = __String::create("1"); draw->retain(); for (auto sprite : _sp) { i++; auto time=DelayTime::create(0.002f * i); auto call = __CCCallFuncND::create(this,callfuncND_selector(gameLayer::showLine),draw);//callfuncND_selector算是一个比较常见的,传递一个void类型的参数 sprite->setTag((int)_sp.size()); sprite->runAction(Sequence::create(time,call, NULL)); }
但是翻遍底层逻辑,回调函数里边并不支持别的类型,转到callfuncND_selector的定义处,我们可以清楚的看到:
class Node;typedef void (Ref::*SEL_CallFunc)();typedef void (Ref::*SEL_CallFuncN)(Node*);typedef void (Ref::*SEL_CallFuncND)(Node*, void*);typedef void (Ref::*SEL_CallFuncO)(Ref*);typedef void (Ref::*SEL_MenuHandler)(Ref*);typedef void (Ref::*SEL_SCHEDULE)(float);#define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)#define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)#define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)#define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)#define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
其中只支持void,node,ref以及float等类型,而我现在需要一个能够传递Vector的回调函数,所以只有自己重写一个了,因为正好callfuncND_selector满足我需要的格式,传递一个psender,以及一个void类型的函数,所以可以抄袭这个类:
class CC_DLL __CCCallFuncND : public CallFunc{public: /** creates the action with the callback and the data to pass as an argument */ CC_DEPRECATED_ATTRIBUTE static __CCCallFuncND * create(Ref* target, SEL_CallFuncND selector, void* d); // // Overrides //virtual __CCCallFuncND* clone() const override; virtual void execute() override; protected: __CCCallFuncND() {} virtual ~__CCCallFuncND() {} /** initializes the action with the callback and the data to pass as an argument */ bool initWithTarget(Ref* target, SEL_CallFuncND selector, void* d); SEL_CallFuncND _callFuncND; void* _data;private: CC_DISALLOW_COPY_AND_ASSIGN(__CCCallFuncND);};
将自己需要的回调函数重写:
//重写动作回调函数typedef void (Ref::*ZYFun)(Node*, Vector<Mysprite*>);//将ZYFun声明为带node,和一个容器的函数,其中Mysprite是我自定义的类,继承自Sprite#define zy_selector(_SELECTOR) static_cast<::ZYFun>(&_SELECTOR)//再宏定义zy_selector回调形式class CC_DLL __ZYCallFuncND : public CallFunc //重写回调函数的类,取名叫__ZYcallFuncND类似<span style="font-family: Menlo;">__CCCallFuncND</span>{public:// CC_DEPRECATED_ATTRIBUTE static __ZYCallFuncND * create(Ref* target, ZYFun selector, Vector<Mysprite*> d);//将参数换成自己的,传递的内容换成自定义的容器形式 virtual __ZYCallFuncND* clone() const override; virtual void execute() override; protected: __ZYCallFuncND() {} virtual ~__ZYCallFuncND() {} /** initializes the action with the callback and the data to pass as an argument */ bool initWithTarget(Ref* target, ZYFun selector,Vector<Mysprite*> d); ZYFun _callFuncND; Vector<Mysprite*> _data; private: CC_DISALLOW_COPY_AND_ASSIGN(__ZYCallFuncND);};再看下cpp文件:
//__ZYCallFuncND自定义的回调函数__ZYCallFuncND * __ZYCallFuncND::create(Ref* target, ZYFun selector, Vector<Mysprite*> d){ __ZYCallFuncND* ret = new __ZYCallFuncND(); if (ret && ret->initWithTarget(target, selector, d)) { ret->autorelease(); return ret; } CC_SAFE_DELETE(ret); return nullptr;}bool __ZYCallFuncND::initWithTarget(Ref* target, ZYFun selector, Vector<Mysprite*> d){ if (CallFunc::initWithTarget(target)) { _data = d; _callFuncND = selector; return true; } return false;}void __ZYCallFuncND::execute(){ if (_callFuncND) { (_selectorTarget->*_callFuncND)(_target, _data); }}__ZYCallFuncND * __ZYCallFuncND::clone() const{ // no copy constructor auto a = new __ZYCallFuncND(); if( _selectorTarget) { a->initWithTarget(_selectorTarget, _callFuncND, _data); } a->autorelease(); return a;}
最后你就可以使用自己的回调函数形式,顺利的传入自己的容器了:
if (_spp.size()>0) { auto call = __ZYCallFuncND::create(this,zy_selector(gameLayer::boomefover),_spp); auto timee=DelayTime::create(0.3); this->runAction(Sequence::create(timee,call, NULL)); }
1 0
- cocos2dx3.0自定义回调函数,传递自己想要的参数
- 回调函数 参数传递
- Cocos2dx3.0 回调函数写法
- 关于sqlite_exec回调函数中参数传递的问题
- javascript的回调函数里如何传递参数
- javascript的回调函数里如何传递参数
- ajax回调函数参数传递
- Javascript AJAX回调函数传递参数
- Java 自定义回调函数(编写属于自己的SDK)
- js回调函数、父画面与子画面之间的js回调函数(含参数传递)
- ajax回调函数参数传递正确方法
- 函数名作为参数传递 与 回调函数
- 函数名作为参数传递 与 回调函数
- jQuery中on方法向回调函数传递参数
- 确保线程结束之前,传递给线程回调函数的参数的有效性
- 如何在dwr的回调函数中传递多个参数
- as3中如何向Alert.show的回调函数传递参数
- C#处理VC++动态库回调函数的字符串指针参数(传递二进制流)
- IOS8 UIAlertController 弹框
- JTable的应用(二)
- Windows系统下一个文件夹里可以放多少个文件?
- JMS学习
- DURABLE在queue和topic中的区别
- cocos2dx3.0自定义回调函数,传递自己想要的参数
- 对jms中Durable Subscription的一种理解
- setWidgetLayoutResource
- java变量的初始化之后的默认值
- 16个很好的在线教育网站
- 泛型的定义及用法
- 年终大学习之软件生命周期
- Unity之一天一个技术点(七)---到包围盒的最近点
- Selenium webdirver操作浏览器