之前我们在学习的过程中,总是提到回调函数这个概念,那么就让我们来了解一下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_0CallFuncN:使用CC_CALLBACK_1,不定参数为执行动作的对象CallFuncND: 被弃用,用CallFuncN代替,使用CC_CALLBACK_1
|
|
菜单项回调menu_selector
|
|
触摸函数
|
|
总结
除了上述所说的回调函数,其他的都没有发生变化,依旧使用原来的回调函数。