您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x通过源代码理解菜单项创建时传入的回调函数实现机制

2016-03-31 10:41 465 查看
/*理解回掉函数参数   关于菜单项的源码分析*/

typedef std::function<void(Ref*)> ccMenuCallback;          //ccMenuCallback是一个函数指针类型(带一个Ref*的参数,返回值为void)
//这个是创建菜单项最后一个参数是回掉函数指针,这里的callback
MenuItemImage * MenuItemImage::create(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage, const ccMenuCallback& callback)
{
MenuItemImage *ret = new (std::nothrow) MenuItemImage();
if (ret && ret->initWithNormalImage(normalImage, selectedImage, disabledImage, callback))
{
ret->autorelease();
return ret;
}
CC_SAFE_DELETE(ret);
return nullptr;
}

//上面函数调用的函数,这个通过图片初始化
bool MenuItemImage::initWithNormalImage(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage, const ccMenuCallback& callback)
{
Node *normalSprite = nullptr;
Node *selectedSprite = nullptr;
Node *disabledSprite = nullptr;

if (normalImage.size() >0)
{
normalSprite = Sprite::create(normalImage);
}

if (selectedImage.size() >0)
{
selectedSprite = Sprite::create(selectedImage);
}

if(disabledImage.size() >0)
{
disabledSprite = Sprite::create(disabledImage);
}
return initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, callback);
}

//上面函数调用的函数,通过精灵初始化
bool MenuItemSprite::initWithNormalSprite(Node* normalSprite, Node* selectedSprite, Node* disabledSprite, const ccMenuCallback& callback)
{
MenuItem::initWithCallback(callback);
setNormalImage(normalSprite);
setSelectedImage(selectedSprite);
setDisabledImage(disabledSprite);

if(_normalImage)
{
this->setContentSize(_normalImage->getContentSize());
}

setCascadeColorEnabled(true);
setCascadeOpacityEnabled(true);

return true;
}

//上面函数调用的函数,初始化菜单项的_callback; 菜单项的成员变量ccMenuCallback _callback;
bool MenuItem::initWithCallback(const ccMenuCallback& callback)
{
setAnchorPoint(Vec2(0.5f, 0.5f));
_callback = callback;
_enabled = true;
_selected = false;
return true;
}

//菜单按下,会执行这个函数
void MenuItem::activate()
{
if (_enabled)
{
if( _callback )
{
_callback(this);       //在这里会传入一个参数,这个参数是菜单项本身
}
#if CC_ENABLE_SCRIPT_BINDING
if (kScriptTypeNone != _scriptType)
{
BasicScriptData data(this);
ScriptEvent scriptEvent(kMenuClickedEvent,&data);
ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&scriptEvent);
}
#endif
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: