【唠叨】
自从3.0引用了C++11标准后,回调函数采用的新的函数适配器:std::function、std::bind。
而曾经的回调函数menu_selector、callfunc_selector、cccontrol_selector等都已经被无情的抛弃了。
取而代之的则是一系列的CC_CALLBACK_*。
【致谢】
http://www.jb51.cc/article/p-gjmsybrk-yt.html
http://www.jb51.cc/article/p-zsmxtvvc-bcy.html
【std::bind】
0、std::bind
请参照上面两篇文章。
1、CC_CALLBACK_*
cocos2dx总共使用了4个std::bind的宏定义,其重点就在于使用了std::bind进行函数适配。
>std::placeholders::_1:不定参数。不事先指定,而是在调用的时候传入。
>##__VA_ARGS__ :可变参数列表。
1
2
3
4
5
6
7
|
//
//newcallbacksbasedonC++11
#defineCC_CALLBACK_0(__selector__,__target__,...)std::bind(&__selector__,##__VA_ARGS__)
#defineCC_CALLBACK_1(__selector__,std::placeholders::_1,##__VA_ARGS__)
#defineCC_CALLBACK_2(__selector__,std::placeholders::_2,##__VA_ARGS__)
#defineCC_CALLBACK_3(__selector__,std::placeholders::_3,##__VA_ARGS__)
//
|
2、变更的回调函数
>动作函数 :CallFunc/CallFuncN
callfunc_selector/callfuncN_selector/callfuncND_selector
>菜单项回调:menu_selector
>触摸事件 :onTouchBegan/onTouchMoved/onTouchEnded
2.1、动作函数CallFunc
可以直接使用CC_CALLBACK_0、CC_CALLBACK_1,也可以直接使用std::bind。
>CallFunc:使用CC_CALLBACK_0。不带任何不定参数。
>CallFuncN:使用CC_CALLBACK_1。需要默认传入不定参数placeholders::_1,其值为:调用该动作的对象(如sprite->runAction(callfun),那么默认的一个不定参数 _1 为 sprite)。
* 函数动作
* -CallFunc
* -CallFuncN
* -CallFuncND与CallFuncO已被遗弃,请使用CallFuncN替代
*/
//2.x版本
CallFunc::create(
this
,callfunc_selector(HelloWorld::callback0));
CCCallFuncN::create(
CCCallFuncND::create(
void
*)10);
//回调函数
HelloWorld::callback1(CCNode*node){}
//CCCallFuncN回调函数
//3.x版本
//使用CC_CALLBACK_*
CallFunc::create(CC_CALLBACK_0(HelloWorld::callback0,monospace!important; font-size:1em!important; min-height:auto!important; background:none!important">));
CallFuncN::create(CC_CALLBACK_1(HelloWorld::callback1,monospace!important; font-size:1em!important; min-height:auto!important; background:none!important">));
CallFuncN::create(CC_CALLBACK_1(HelloWorld::callback2,0.5));
//使用std::bind
//其中sprite为执行动作的精灵
CallFunc::create(std::bind(&HelloWorld::callback0,monospace!important; font-size:1em!important; min-height:auto!important; background:none!important">));
CallFuncN::create(std::bind(&HelloWorld::callback1,sprite);
CallFuncN::create(std::bind(&HelloWorld::callback2,sprite,0.5));
//回调函数
HelloWorld::callback0(){}
HelloWorld::callback1(Node*node){}
//