Cocos2dx 3.0 过渡篇(二) 事件回调

尊重原创,转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/18216679

3.0 后的事件回调函数接口都不一样了,例如按钮的menu_selector(),update的 schedule_selector等,都已成明日黄花。而新的回调接口,则由四个CC_CALLBACK取代。

下面先举例一些不同的调用方法:

1、按钮:CC_CALLBACK1

[cpp] view
plain
copy

  1. 2.0  
  2. MenuItemImage* item =MenuItemImage::create("","",this,menu_selector(HelloWorld::callback));  
  3. 3.0  
  4. auto item = MenuItemImage::create("","",CC_CALLBACK1(HelloWorld::callback,this));  

看到这里有人可能会问,如果要更改按钮的回调函数怎么做呢?如果你继续用setTarget();这个接口,那可行不通了。

3.0里用setCallback()  替代了 setTarget(Object *rec, SEL_MenuHandler selector),参数如下:

setCallback(const ccMenuCallback&callback);

这里有看到一个新鲜的词:

ccMenuCallback,这货是什么碗糕?哈哈哈哈,如果你问我,那你就问错人了!!!我也只能告诉你大概是怎么个用法,嘿嘿。

首先,从setTarget()和setCallback()里的参数变化可以看出,ccMenuCallback 实际上就包含了Object *rec, SEL_MenuHandler selector这俩参数,举个例子:

[cpp] view
plain
copy

  1. 2.0  
  2. Item->setTarget(this,menu_selector(HelloWorld::callback));  
  3. 3.0  
  4. Item->setCallback(CC_CALLBACK1(HelloWorld::callback,this));  

恩,就是这样子,怎么感觉说的都没啥深度,噗,有点模仿“笨木头”的语气呀。

 

2、action 回调 CC_CALLBACK0 ;CC_CALLBACK1

先举例:

1)回调函数不带参数的情况

[cpp] view
plain
copy

  1. 2.0  
  2. CallFunc::create(this,callfunc_selector(ActionSequence2::callback1));  
  3. void ActionSequence2::callback1(){};  
  4. 3.0  
  5. CallFunc::create(CC_CALLBACK_0(ActionSequence2::callback1,this)),  
  6. void ActionSequence2::callback1(){};  

2)回调函数带参数的情况

[cpp] view
plain
copy

  1. 2.0  
  2. CCSequence* seq = CCSequence::create(  
  3.     MoveBy::create(2.0f,ccp(150,0)),  
  4.     CallFuncN::create(this,callfuncN_selector(ActionCallFunc::callback)),  
  5.     NULL);  
  6. 3.0  
  7.  auto action = Sequence::create(  
  8.         MoveBy::create(2.0f, Point(150,0)),  
  9.         CallFuncN::create( CC_CALLBACK_1(ActionCallFuncN::callback, this)),  
  10.         NULL);  

小小的总结下:CC_CALLBACK0是回调不带参数的回调函数,CC_CALLBACK1带一个参数的回调函数。

既然说到了action,顺便再说下3.0里Callfunc的新的用法(之前的版本应该没有吧…)

[cpp] view
plain
copy

  1. auto action1 = CallFunc::create(  
  2.   
  3. [&](){  
  4.   
  5. auto s =Director::sharedDirector()->getWinSize();  
  6.   
  7. auto label =LabelTTF::create("called:lambda callback", "Marker Felt", 16);  
  8.   
  9. label->setPosition(ccp(s.width/4*1,s.height/2-40));  
  10.   
  11. this->addChild(label);  
  12.   
  13. } );  

以前动作回调都是要新写一个回调函数,这样子虽然问题不大,但如果用到回调的地方多了,而且回调的代码也就几行而已,那之前的做法就有点受不了,现在好了,可以直接把动作执行完要回调的函数代码直接写到创建里来,是不是方便多了。不是很理解的童鞋可以看下我另外一篇博客http://blog.csdn.net/start530/article/details/19913611

3、触摸回调,CC_CALLBACK2 这个打算下一篇重点讲,所以这个先列下用法。

[cpp] view
plain
copy

  1. auto touchListener = EventListenerTouchOneByOne::create();  
  2. touchListener->setSwallowTouches(true);  
  3.     
  4. touchListener->onTouchBegan = CC_CALLBACK_2(MyMenu::onTouchBegan, this);  
  5. touchListener->onTouchMoved = CC_CALLBACK_2(MyMenu::onTouchMoved, this);  
  6. touchListener->onTouchEnded = CC_CALLBACK_2(MyMenu::onTouchEnded, this);  
  7. touchListener->onTouchCancelled = CC_CALLBACK_2(MyMenu::onTouchCancelled, this);  
  8.     
  9. _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);  

恩,目前也就了解这些了。以后再继续补吧。
转载请注明源地址:http://blog.csdn.net/start530/article/details/18216679

时间: 2025-01-21 03:13:41

Cocos2dx 3.0 过渡篇(二) 事件回调的相关文章

Cocos2dx 3.0 过渡篇(十二) lambda表达式的使用

本篇博客来自star特530,转载请注明出处.http://blog.csdn.net/start530/article/details/19913611 Cocos2dx 3.0 版本后加入了lambda表达式,或者说C++ 11终于引入了lambda表达式,那么,什么是lambda表达式呢? 例如调用<algorithm>中的std::sort,ISO C++ 98 的写法是要先写一个compare函数: [cpp] view plaincopy bool compare(int &

Cocos2dx 3.0 过渡篇(四) 创建项目

尊重原创,转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/18620001 前天参加同学的婚礼,喝酒喝得差点没把胃都给吐出来.昨天一天 请假在家里休养.今早原地满血复活,觉得有必要再写篇博客,告诉大家,我又回来啦. 话说应该写点什么内容呢?干脆写个在3.0Alpha1版本上创建项目的流程吧,就当做笔记. 在Cocos2dx 3.0 Beta版本创建项目的方式已经更改,由于我近阶段都是用Alpha1版本开发

Cocos2dx 3.0 过渡篇(十五)帧动画的存储播放

前两篇博文用恶搞的形式写了action的相关使用,这算是自己的一种尝试,也可以说是心情的发泄.本篇是action三板斧的最后一板,经过深思熟虑后,我决定就用正常人的方式写吧... 这次主要介绍动画的创建即存储,要实现的功能有:1.创建四组动画,并存放至Array中: 2.创建四个虚拟方向按钮,控制精灵移动与播放相应方向的动画: -------------------------------------------------------------------------------------

Cocos2dx 3.0 过渡篇(五) 随机数的获取

本来上午是要转载一篇看起来还不错的博客,被cocos2dx官方微博推荐过.谁知道早上打开链接时那篇博客已经转为私密了.早知道昨晚就应该复制一下内容,今天厚脸皮的来篇原创岂不妙哉.哈哈. 1.简单的随机数用法:CCRANDOM_0_1 示例如下: [cpp] view plaincopy int HelloWorld::getRand(int start,int end)   {    float i = CCRANDOM_0_1()*(end-start+1)+start;  //产生一个从st

Cocos2dx 3.0 过渡篇(十三) action的用法从一个故事说起

本篇博客来自star特530,转载请注明出处.http://blog.csdn.net/start530/article/details/20153367-------------动作到底该怎么玩?说的也就是runAction这货了.如果你觉得本文还是在写像MoveTo,SacleTo这类动作的用法的话,那你就错了.那样不够厚道.当然了,像Sequence,Spawn这类的东西多少也是会涉及到一点的.那到底要写什么呢?我们的故事从这里开始. 首先我们创建俩精灵,就命名为boy 和 girl 吧.

Cocos2dx 3.0 过渡篇(十)资源加载进度条Loading...

尊重原创,转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/19420317 本来这篇博文是昨晚就要写的,可是因为今早要去参加考驾照相关的体检,而我最害怕的就是视力没能达到5.0,毕竟这阶段对着屏幕的时间过久. 所以呢,昨晚我几乎没碰电脑,没玩手机,早睡早起.体检顺利通过! 首先,我要说的是:这次我要写的主题是进度条. 额,等等,先收起你手里愤怒的西瓜刀.我也才知道TestCpp也有这个例子啊.不过Test

Cocos2dx 3.0 过渡篇(三) 触摸机制

尊重原创,转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/18325493 本来在中午休息时间打算大展拳脚,好好写一篇新触摸机制相关的博文,结果,等真正下手的时候才发现无从下手,很多地方自己都说不清,赶紧看了下testCpp,才发现原来是这样,还可以这样,哦?这样都行?哎,我还是太年轻了.   咱也只能挑简单的讲了. 假设要实现拖动一个精灵移动,那我们的步骤是: 1. 创建一个精灵sprite: 2.一个

Cocos2dx 3.0 过渡篇(七)EditBox和ControlSlider不得不说的故事

尊重原创,转载请注明来自:star特530的CSDN博客  http://blog.csdn.net/start530/article/details/18993085 初八开始上班,我竟然能马上进入工作状态,真是蛮佩服自己的. 正月放假这阶段发生了好多事.对我的影响很大. 消沉了好几天,现在,我满血满状态的复活了.我是 这么容易放弃的人么?既然舍不得,就不该轻言放弃!即使希望渺茫,还是应该努力争取下! 程序员之路,就是应该克服各种艰难险阻,将不可能变成可能. ---------机智的少年,你要

Cocos2dx 3.0 过渡篇(九)浅谈容器Map

尊重原创,转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/19284301 本篇接着上一篇的容器继续唠叨,了解上一篇:http://blog.csdn.net/start530/article/details/19170853 既然Vector是对比Array,那么Map就对比Dictionary吧.1.创建 [cpp] view plaincopy auto sp1 = Sprite::create("