Cocos2d-x 3.X 里的回调函数及其参数适配
2016-01-11 23:37
316 查看
作为一个游戏引擎,为了满足用户的各种响应需求,必然要大量用到回调函数(关于什么是回调函数,请参考这里)。Cocos2d-x 3.X里面至少有以下三个地方需要用到回调函数。
*)>类型。
(Ref::*)(float)类型,注意它没有使用std::function,所以对类型要求比较严格,不能直接使用CC_CALLBACK_1来适配回调函数,也不能使用lambda表达式,必须使用schedule_selector(过时)或者CC_SCHEDULE_SELECTOR(新版)来转换类型。例如下面的代码实现了延时1秒之后输出一窜字符。
常用就是这三种回调函数,他们对类型的要求各不相同,所以在使用的时候需要注意。
水平有限,如有不妥,欢迎拍砖!
1. 按钮回调
当我们按下一个按钮的时候,肯定是要触发某个事件的。这个触发事件就是通过回调函数来实现的。例如下面这个菜单项回调函数,就实现了按下菜单项就返回首页这么个功能。auto homeItem = MenuItemImage::create( "homeUp.png", "homeDown.png", CC_CALLBACK_1(GameOverLayer::homeCallback, this)); void GameOverLayer::homeCallback(cocos2d::Ref* pSender) { Director::getInstance()->replaceScene(HomeScene::createScene()); }其中宏CC_CALLBACK_1定义为bind函数(关于bind函数,请参考这里)。数字1表示绑定完之后的回调函数只能有一个参数。在这个例子中这个参数就是pSender,而且它必须是Ref*类型。因为回调函数是作为一种参数被别的函数调用的,它的类型(即它的参数和返回类型)由调用它的函数确定。这个例子中,声明MenuItemImage::create函数时就已经规定了它的回调函数必须是ccMenuCallback类型,也就是std::function<void(Ref
*)>类型。
2. 动作回调
当某个精灵在运行某个连续动作的过程之中,或者动作完成之后要触发某个事件或任务,就可以在连续动作之中或之后插入一个回调函数,用来触发某个事件。例如下面这个例子就实现了停顿1秒之后切换到结束场景。_owner->runAction(Sequence::create(DelayTime::create(1), CallFunc::create(CC_CALLBACK_0(FrogController::youWin, this)), NULL)); void FrogController::youWin() { auto gameOverScene = GameOverScene::create(); Director::getInstance()->replaceScene(gameOverScene); }因为是在运行动作函数里面调用,所以必须先用CallFunc(继承了ActionInstant)把回调函数包装成动作类,且该回调函数无参。如果需要有Node*参数,那么要调用CallFuncN来包装。如果需要有Ref*参数,就用CallFuncND来包装。
3. 调度器回调
当我们要定时触发某个事件或任务时就要用到调度器了。Cocos2d-x里面有三种调度器,分别是默认调度器scheduleUpdate(),自定义调度器schedule()和单次调度器scheduleOnce()。关于scheduleUpdate()的使用可以参考这里。schedule()和scheduleOnce()里的回调函数必须是void(Ref::*)(float)类型,注意它没有使用std::function,所以对类型要求比较严格,不能直接使用CC_CALLBACK_1来适配回调函数,也不能使用lambda表达式,必须使用schedule_selector(过时)或者CC_SCHEDULE_SELECTOR(新版)来转换类型。例如下面的代码实现了延时1秒之后输出一窜字符。
abc=10; scheduleOnce(schedule_selector(HelloWorld::scheduleCallback), 1.0); void HelloWorld::scheduleCallback(float dt) { log("abc=%d", abc); }scheduleOnce这个调度器有时候会不好使,我尚未搞清楚原因,不知道是不是时间的匹配问题,望广大网友赐教。当碰到不好使的时候,一个解决方案就是把他改成动作回调。
常用就是这三种回调函数,他们对类型的要求各不相同,所以在使用的时候需要注意。
水平有限,如有不妥,欢迎拍砖!
相关文章推荐
- oracle em 按钮乱码解决办法及em网页变成英文
- css文本框与按钮美化效果代码
- 用CSS实现的一张图完成的按钮效果
- css样式之区分input是按钮还是文本框的方法第1/4页
- C#中异步回调函数用法实例
- Cocos2d-x中背景音乐和音效使用实例
- Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
- Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例
- Cocos2d-x UI开发之文本类使用实例
- Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法
- jQuery移动页面开发中主题按钮的设计示例
- Cocos2d-x UI开发之菜单类使用实例
- node.js回调函数之阻塞调用与非阻塞调用
- ON_COMMAND_RANGE多个按钮响应一个函数的解决方法
- Cocos2d-x UI开发之CCControlButton控件类实例
- Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系
- C#利用反射技术实现去掉按钮选中时的边框效果
- 浅谈javascript回调函数
- winform实现关闭按钮失效的两种方法
- JavaScript实现自动消除按钮功能的方法