【cocos2d-x 3.x 学习与应用总结】4: 理解CC_CALLBACK_0, CC_CALLBACK_1, CC_CALLBACK_2, CC_CALLBACK_3
来源:互联网 发布:大数据毕业设计 编辑:程序博客网 时间:2024/06/05 04:56
前言
得益于C++11的新特性,cocos 3.x版本在很多地方的代码看起来都优美了许多。这其中就包括一些回调函数的写法,CC_CALLBACK_N
系列宏的作用是对一个成员函数进行适配并返回一个回调函数。本文介绍一下我对CC_CALLBACK_N
系列宏的理解。
使用CC_CALLBACK_N
的例子
下面这段代码来自cocos官方示例中的ActionTest.cpp, 这是在创建一个CallFunc的回调。
使用CC_CALLBACK_0
来代替其原来的创建回调的方式:
使用CC_CALLBACK_0
来改写上面三个回调的创建:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
如何理解CC_CALLBACK_0
, CC_CALLBACK_1
, CC_CALLBACK_2
, CC_CALLBACK_3
这个CC_CALLBACK_0
其实就是std::bind,下面是它和它的小伙伴们:
defined in ccMacro.h
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
为了让这几个宏看起来更清晰,在上面我使用了using声明整理了一下代码。
这四个宏的作用都是用来适配函数,把一个原始函数A,包装成函数B。这里面的A需要是一个类的成员函数,其中的:
__selector__
就是这个成员函数,比如MyClass::func;
__target__
是MyClass类型的一个对象(或者是对象的引用和指针,比如最常见的this)
其它的参数,或者是占位符(_1, _2, _3
)或者是具体的参数,具体的细节请参考我的这篇【C++ STL学习与应用总结】22: 函数组合之1:如何使用std::bind.
如何理解这几个参数的命名呢?为什么是0, 1, 2, 3?
是这样的,结尾的数字N,代表者CC_CALLBACK_N
这个宏返回的结果是一个需要N个参数的函数。
CC_CALLBACK_<font color="red">0</font>
意思就是返回一个需要0个参数方可调用的函数, 也就是说不需要参数就能调用的函数CC_CALLBACK_<font color="red">1</font>
意思就是返回一个需要1个参数方可调用的函数CC_CALLBACK_<font color="red">2</font>
意思就是返回一个需要2个参数方可调用的函数CC_CALLBACK_<font color="red">3</font>
意思就是返回一个需要3个参数方可调用的函数
这里需要的参数个数其实也就是占位符的个数(_1, _2, _3
), 占位符是需要在函数调用的时候用具体的实参来替换的。
这样理解了之后,就很容易知道什么时候该用哪个宏了。
比如,我要创建一个CallFunc, static CallFunc * create(const std::function<void()>& func);
, 从其声明可以看出它需要一个不用参数就能调用的函数,那么我就可以用CC_CALLBACK_0
。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
即使callback2接收N个参数,我也可以使用CC_CALLBACK_0
来把它适配成一个不需要参数就能调用的函数。这是std::bind的工作方式决定的,我只需把callback2需要的参数填入CC_CALLBACK_0
里面就好。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
CC_CALLBACK_1
在CallFuncN::create中的使用
CallFuncN::create的原型:
static CallFuncN * create(const std::function<void(Node*)>& func);
从create的参数可以看到,它需要一个“需要一个Node*参数的参数方可调用的函数”, 这刚好和前面讲到的CC_CALLBACK_1
的作用一样。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
CC_CALLBACK_2
, CC_CALLBACK_3
的使用方式与此类似,不再赘述。
原文链接http://blog.csdn.net/elloop/article/details/50445722
- 【cocos2d-x 3.x 学习与应用总结】4: 理解CC_CALLBACK_0, CC_CALLBACK_1, CC_CALLBACK_2, CC_CALLBACK_3
- 【cocos2d-x 3.x 学习与应用总结】4: 理解CC_CALLBACK_0, CC_CALLBACK_1, CC_CALLBACK_2, CC_CALLBACK_3
- 【cocos2d-x 3.x 学习与应用总结】4: 理解CC_CALLBACK_0, CC_CALLBACK_1, CC_CALLBACK_2, CC_CALLBACK_3
- 【cocos2d-x 3.x 学习与应用总结】2: 在cocos2d-x中使用ccbi
- 【Cocos2dx 3.0学习笔记】回调函数的创建,涉及到CallFunc、CallFuncN、CC_CALLBACK_0、CC_CALLBACK_1、CC_CALLBACK_2等内容
- 【cocos2d-x 2.x 学习与应用总结】11: 理解CCGLProgram
- 【cocos2d-x 3.x 学习与应用总结】4: 使用cocos compile编译apk
- cocos2d-x 3.3 CC_CALLBACK_0 std::bind与std::function
- 【cocos2d-x 2.x 学习与应用总结】12: cocos2d-x预定义shader源码
- Cocos2dx 3.X 中CC_CALLBACK_0 1 2 3理解
- 【cocos2d-x 3.x 学习与应用总结】3: CallFunc系列
- 【cocos2d-x 学习与应用总结】最近一段时间使用cocos2d-x lua的总结
- 【cocos2d-x 2.x 学习与应用总结】10: cocos2d-x自带的shader及其使用
- cocos2d-x 学习应用
- 【cocos2d-x 2.x 学习与应用总结】13: 借助CCGLProgram实现自定义绘制
- 【cocos2d-x 2.x 学习与应用总结】14: 自定义shader绘制混合颜色的矩形
- cocos2d-x学习:CCSprite总结
- cocos2d-x学习:CCSprite总结
- LeetCode11. Container With Most Water
- 简单聊团队合作
- ExpandableListView分组列表
- 系统恢复技术-忘记root密码,怎样改
- 新建SSSP项目时无法运行项目
- 【cocos2d-x 3.x 学习与应用总结】4: 理解CC_CALLBACK_0, CC_CALLBACK_1, CC_CALLBACK_2, CC_CALLBACK_3
- Pandas库
- windows系统下mysql修改默认字符编码
- C++入门基础
- 函数、数组
- CentOs 安装tomcat7
- iOS之imageView的图片不变形,居中
- 使用Spring的WebAsyncTask异步请求时出错Can't set AsyncWebRequest with concurrent handling in progress
- 最新版SDWebImage的使用