Cocos2d-x中的CC_CALLBACK_X详解
Cocos2d-x 3.x版本用CC_CALLBACK_0,CC_CALLBACK_1,CC_CALLBACK_2和CC_CALLBACK_3的宏来定义回调方法类的。
3.x版本的例子:
child->runAction(Sequence::create(
DelayTime::create(1.4f),
CallFunc::create( CC_CALLBACK_0(CrashTest::removeThis,this)),
nullptr)
);
这里的含义就是child执行了一个Action,这个Action是一个队列,队列的第一个执行是一个延时操作,第二个执行是一个回调。意思就是经过1.4秒后调用this对象的removeThis方法。
CC_CALLBACK_0中有两个参数,第一个是要回调的方法名称,用类名加方法的形式,第二个参数是函数被调用的对象的指针,一般是this。
很多人认为CC_CALLBACK_0中的0是代表回调的removeThis方法的参数是0个的意思,其实并不是。
看下面的例子:
auto action = Sequence::create(
Place::create(Vec2(,)),
Show::create(),
MoveBy::create(, Vec2(,)),
CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback1,this)),
CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback2,this,_grossini)),
CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback3,this,_grossini,0xbebabeba)),
nullptr);
void ActionSequence2::callback1()
void ActionSequence2::callback2(Node* sender)
void ActionSequence2::callback3(Node* sender, long data)
这里的三个CC_CALLBACK_0的参数列表中,除了第一个回调的方法和第二个调用的对象,第二个CC_CALLBACK_0中多了一个参数_grossini,这个变量在回调ActionSequence2::callback2方法时作为参数使用,ActionSequence2::callback2(_grossini)。同样的ActionSequence2::callback3方法调用时的参数是_grossini和0xbebabeba,ActionSequence2::callback3(_grossini,0xbebabeba)。
CC_CALLBACK_0中的0是代表要回调的方法绑定第0个参数之后的参数。
ActionSequence2::callback2第0个后面的参数就是_grossini,那么_grossini就是第1个参数,调用就是ActionSequence2::callback2(_grossini)这个样子。
那么, 同样的道理CC_CALLBACK_1,2,3就代表回调的方法绑定第1,2,3个参数之后的参数。
我们再看个例子:
// Get
auto labelGet = Label::createWithTTF("Test Get", "fonts/arial.ttf", );
auto itemGet = MenuItemLabel::create(labelGet, CC_CALLBACK_1(HttpClientTest::onMenuGetTestClicked, this, false));
itemGet->setPosition(LEFT, winSize.height - MARGIN - SPACE);
menuRequest->addChild(itemGet);
void HttpClientTest::onMenuGetTestClicked(cocos2d::Ref *sender, bool isImmediate)
这里的CC_CALLBACK_1有三个参数,前两个就不多说了,第三个参数fasle就是回调函数onMenuGetTestClicked中的第1个参数之后的参数,也就是第二个参数。
这个回调在调用的地方是这样:
_callback(this);
调用的时候只需要第一个参数,而第二个参数会被指定为false。
举一个很容易理解的例子:
int add (int a, int b)
{
return a+b;
} auto func = CC_CALLLBACK_1(add, this, ); cout << func() << endl; // 结果是 5
func是一个回调方法,默认指定了第二个参数是2,调用的时候只需要指定第一个参数就可以了。
说完CC_CALLBACK的用法,再看看CC_CALLBACK这个宏的定义:
// new callbacks based on C++11
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)
C++11引入了boost库的function和bind,bind也被3.x版本用来作为回调的绑定。
__selector__是绑定回调的方法
__target__是调用方法的对象
##__VA_ARGS__是可变的参数列表
std::placeholders::_1是占位符
std::placeholders::_2同上是占位符
Cocos2d-x中的CC_CALLBACK_X详解的更多相关文章
- php中关于引用(&)详解
php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- AngularJS select中ngOptions用法详解
AngularJS select中ngOptions用法详解 一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...
- 【转载】C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
- Android中mesure过程详解
我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性,对于这两个属性我们有三种选择:赋值成具体的数值,match_parent或者wrap_conte ...
- Android中Intent组件详解
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...
随机推荐
- 负载均衡 Lvs DR 模式笔记
先来一张原理图,相当于ip-tun模式把tunl0的那块网卡配置在eth0:0的这个接口上,避免了兼容性的问题
- HDU -2100-Lovekey
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2100 这题开始一直想着先把26进制转换成10进制,在转换成26进制,又200个字符因而行不通, 直接卡 ...
- 大数据时代的杀手锏----Tachyon
一.Tachyon系统的简介 Tachyon是一个分布式内存文件系统,可以在集群里以访问内存的速度来访问存在tachyon里的文件.把 Tachyon是架构在最底层的分布式文件存储和上层的各种计算框架 ...
- Java线程:堵塞队列与堵塞栈
一.堵塞队列 Java定义了堵塞队列的接口java.util.concurrent.BlockingQueue,堵塞队列是一个指定长度的队列,当试图向队列中添加元素而队列已满,或者是想从队列移出元素而 ...
- jQuery的each函数
http://www.cnblogs.com/xiaojinhe2/archive/2011/10/12/2208740.html http://www.cnblogs.com/mabelstyle/ ...
- 将 Callout 容器添加到移动设备应用程序中
在移动设备应用程序中,callout 是在应用程序顶部弹出的容器.该容器可以容纳一个或多个组件,并且支持不同类型的布局. callout 容器可以是模态或非模态容器.模态容器在其关闭之前接受所有的键盘 ...
- vs生成配置release自动恢复成debug无法配置的问题
软件为visual studio 2015,右键单个项目选属性,设置“生成配置”release,保存后,再次右键属性,却发现又自动恢复成debug,怎么回事?是无法配置吗?点击生成试试,果然2b了. ...
- asp.net core mvc权限控制:权限控制介绍
在进行业务软件开发的时候,都会涉及到权限控制的问题,asp.net core mvc提供了相关特性. 在具体介绍使用方法前,我们需要先了解几个概念: 1,claim:英文翻译过来是声明的意思,一个cl ...
- react native 添加第三方插件react-native-orientation(横竖屏设置功能 android)
Installation 1.install rnpm Run npm install -g rnpm 2.via rnpm Run rnpm install react-native-orien ...
- (@WhiteTaken)设计模式学习——原型模式
有这样一个需求,两个对象,只是名称以及其他几个属性不一样,而其他的大部分的属性都是相同的. 这时候我们可以用到原型模式,也就是克隆模式. 原型模式:原型模式是一个对象创建型模式,通过克隆原对象,可以使 ...