上篇讲到,自定义一个宏,实现按钮的音效在绑定的回调调用前播放。那么,现在就来详细分析一下,这是如何做到的,其实,主要就是要弄明白,回调函数是如何绑定,以及被调用。
1.回调函数如何绑定:
在CCMenuItem.h里边有如下代码:
typedef std::function<void(Ref*)> ccMenuCallback;
/*ccMenuCallback其实就是个可调用对象,这个可调用对象的参数是Ref*类型,返回值是viod。
怎么样,是不是跟HelloWord里边的回调函数类型一模一样?*/
ccMenuCallback _callback;
/*
这个_callback,是一个成员变量,我们绑定的回调函数最终是个可调用对象放到这里
*/
以MenuItemLabel为例,它创建的时候是这样子的
/*创建的时候传入一个可调用对象,也就是我们使用那个宏的结果*/
MenuItemLabel * MenuItemLabel::create(Node*label, const ccMenuCallback& callback)
{
MenuItemLabel *ret = new (std::nothrow) MenuItemLabel();
ret->initWithLabel(label, callback);//这里初始化的时候也传了过去
ret->autorelease();
return ret;
}
//MenuItemLabel的一个初始化函数
bool MenuItemLabel::initWithLabel(Node* label, const ccMenuCallback& callback)
{
//这里调用父类MenuItem的初始化函数,我们的回调函数传进去
MenuItem::initWithCallback(callback);
_originalScale = 1.0f;
_colorBackup = Color3B::WHITE;
setDisabledColor(Color3B(126,126,126));
this->setLabel(label);
setCascadeColorEnabled(true);
setCascadeOpacityEnabled(true);
return true;
}
//这是MenuItem的初始化函数
bool MenuItem::initWithCallback(const ccMenuCallback& callback)
{
setAnchorPoint(Vec2(0.5f, 0.5