在coco中,经常可以看到回调函数的身影,从3.x开始,coco采用c++11的std::bind作为回调函数的承载
如果对std::bind不太了解的同学可以看看关于std::bind的详解
#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__)
coco中CC_CALLBACK_这种形式的回调函数总共有四个,根据名字我们可以很容易区分他们的含义,分别是1个参数、2个参数。。。。
那么问题来了:我们虽然知道了参数的个数,但是我们怎么知道参数的类型呢?
很简单:利用visual studio这一强大的工具
比如说btn->addTouchEventListener();
,如果我们不知道他需要怎样的一个回调函数
我们可以选中addTouchEventListener()
这个方法,然后按F12键即可查看源码
这里就可以看见回调函数的类型了,是一个ccWidgetTouchCallback
的常引用
我们继续跟进,在ccWidgetTouchCallback
上按F12
到这里,我们就可以很清楚的知道回调函数的参数啦
下面以button为例,我们来一窥该回调函数的用法
首先先通过cocostudio创建一个button按钮(也可以自己创建,这里以cocostudio为例)
绑定button按钮
Button* btn = (Button*)Helper::seekWidgetByName(root, "btn");
为button绑定一个触摸事件
假设本类中有一个私有成员函数,函数定义如下:
btn->addTouchEventListener(CC_CALLBACK_2(Login::StartGameTouch,this));
ps:- pSender表示不同的触摸对象
- begin 选中,但是并未弹起
- moved 选中,并且滑动,但是未松手
- ended 选中,然后松手
- canceled 选中,但是滑动到按钮之外
这样,一个回调函数就写好了,我们可以通过不同的事件来做出不同的响应
最后要提的一点是,如果想要传入自定义的数据(比如一个角色类)
那么我们可以使用setUserObject()
方法
不过传入这个方法的对象都必须继承Ref类
然后在回调函数中通过pSender来获得我们需要的数据
比如我们自定义一个角色类RoleModel : public Ref
然后在回调函数中:
RoleModel * role = (RoleModel *)((Button*)pSender)->getUserObject();
其中Button: 之前是哪个对象传入,就用哪个对象强转