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 } }
相关文章推荐
- cocos2dx 3.3 + lua 学习笔记(01)--- math库
- cocos学习心得3
- Xcode 7.3编译的cocos2d-x程序崩溃问题
- CocosCreator教程资料索引[2016.2.18已更新]
- quick-cocos2dx 之transition.execute()的缓动效果
- cocos2d_x_08_游戏_FlappyBird
- cocos2dx3.x+cocostudio多屏幕分辨率适配解决方案(干货)
- cocos打包Android
- cocos-lua 延时执行 和 scheduler
- cocos2dx中DrawNode画线锯齿和非凸多边形填充
- cocos2dx3.2 lua 独立自定义socket类绑定问题
- cocos2dx3.0rc导出自定义类到lua的方法详细步骤
- cocos2dx 对象属性设置
- cocos2d-x避免手动修改android.mk文件来编译
- Cocos2d-x游戏中默认的AndroidManifest.xml的解析
- cocos2dx TexturePacker加密资源
- cocos2dx 3.xLua脚本加密解密
- cocos2dx 外观者模式
- cocos学习心得2
- Cocos2d-x 多分辨率适配完全解析