之前我们在学习的过程中,总是提到回调函数这个概念,那么就让我们来了解一下Cocos中的回调函数吧。
本文仅供个人记录和复习,不用于其他用途
函数适配器
std::bind
是C++11的函数适配器,我的另一篇文章中也介绍过。那么什么是函数适配器呢?比如我们使用find_if()
查找vector
中的某些元素时,需要我们提供一个一元函数对象。但是呢,如果我们提供的是二元函数对象,那么就无法使用find_if()
。为了将二元函数对象转换成一元函数对象,我们使用函数适配器。
|
|
这里的greater<>()
是一个二元函数对象,我们把5绑定到第二个参数。这样,find_if()
只需传递一个参数给函数对象。
可能有人有疑问,为什么会提供一个二元函数对象给find_if()
,而不是直接写一个一元函数对象呢?那么举个简单的例子,我们提供的函数对象用于查找vector
中大于5的数,那么你当然可以把vector
中的元素和5比较。但如果我需要和6、7或者其他数比较呢?每次都要修改的话十分麻烦,而且如果你不能修改源码的话,那么就是一个很头疼的问题。这样,我们就只好写一个二元函数,而函数适配器的作用就体现出来了。
新版本回调函数
新版本的回调函数有以下几种:
- CC_CALLBACK_0
- CC_CALLBACK_1
- CC_CALLBACK_2
- CC_CALLBACK_3
它们的区别就在于参数的多少,最后的数字就是参数的个数。之前的menu_selector
之类的回调函数将被这些所取代。
回调函数与bind
说了这么多,最主要的还是得讲一讲bind
和回调函数的关系。
|
std::placeholders::_1
是不定参数,在调用的时候传入,而##VA_ARGS
是可变参数宏,至于回调函数其实就是bind。bind的使用方法如下:
|
|
arg_list
就是可变参数列表,我们在调用newCallBack
时,newCallBack
就会调用callback
,并且将arg_list
传入到callback
。我们再来说得详细一点:
|
|
这里_1
代表着一个占位符对象,当callback
通过newCallBack
被调用时,指代newCallBack
中的第一个参数在函数callback
的参数列表中的位置。newCallBack
的第一个参数就是_1
,后面以此类推。1.5就是默认参数,这里就代表着three。_1
等占位符定义在placeholders
命名空间中,完整的使用就是std::placeholders::_1
。
变更的回调函数
理清了回调函数与bind
的关系,接下来就看看哪些回调函数被弃用了:
- 动作函数:
callfunc_selector
、callfuncN_selector
、callfuncND_selector
- 菜单项函数:
menu_selector
- 触摸函数:
onTouchBegan
、onTouchMoved
、onTouchEnded
下面将一一介绍。
动作函数CallFunc
CallFunc
:使用CC_CALLBACK_0
CallFuncN
:使用CC_CALLBACK_1
,不定参数为执行动作的对象CallFuncND
: 被弃用,用CallFuncN
代替,使用CC_CALLBACK_1
|
|
菜单项回调menu_selector
|
|
触摸函数
|
|
总结
除了上述所说的回调函数,其他的都没有发生变化,依旧使用原来的回调函数。