欢迎光临Software MyZone,有问题可留言或到站点论坛发帖,争取第一时间帮忙解决 || 站点论坛:火龙论坛 || 淘宝小店:应小心的易淘屋 【欢迎大家提建设性意见】

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

欢迎热爱编程的朋友们参与到cocos2d-x编程中,为了给大家提供良好的交流环境,网站以开启QQ群
Software MyZone:66202765(群号,欢迎加入,若满,请加1群)
Software MyZone 1群(2dx):286504621
【加群请写:Software MyZone或者是firedragonpzy】
淘宝店:【应小心的易淘屋】初次开店,大家多多支持……
群论坛:火龙论坛正试运营阶段,欢迎大家多提些建设性意见……
摘自:http://blog.csdn.net/start530/article/details/18216679

 

每日一曲【程序猿做久了,你是否忽略了身边的人?】

 

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

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

1、按钮:CC_CALLBACK1


//2.x
MenuItemImage* item =MenuItemImage::create("","",this,menu_selector(HelloWorld::callback));
//3.x
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这俩参数,举个例子:


//2.x
Item->setTarget(this,menu_selector(HelloWorld::callback));
//3.x
Item->setCallback(CC_CALLBACK1(HelloWorld::callback,this));

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

 

2、action 回调 CC_CALLBACK0 ;CC_CALLBACK1

先举例:

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


//2.x
CallFunc::create(this,callfunc_selector(ActionSequence2::callback1));
void ActionSequence2::callback1(){};
//3.x
CallFunc::create(CC_CALLBACK_0(ActionSequence2::callback1,this)),
void ActionSequence2::callback1(){};

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


//2.x
CCSequence* seq = CCSequence::create(
MoveBy::create(2.0f,ccp(150,0)),
CallFuncN::create(this,callfuncN_selector(ActionCallFunc::callback)),
NULL);
//3.x
auto action = Sequence::create(
MoveBy::create(2.0f, Point(150,0)),
CallFuncN::create( CC_CALLBACK_1(ActionCallFuncN::callback, this)),
NULL);

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

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


auto action1 = CallFunc::create(

[&](){

auto s =Director::sharedDirector()->getWinSize();

auto label =LabelTTF::create("called:lambda callback", "Marker Felt", 16);

label->setPosition(ccp(s.width/4*1,s.height/2-40));

this->addChild(label);

} );

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

 

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


auto touchListener = EventListenerTouchOneByOne::create();
touchListener->setSwallowTouches(true);

touchListener->onTouchBegan = CC_CALLBACK_2(MyMenu::onTouchBegan, this);
touchListener->onTouchMoved = CC_CALLBACK_2(MyMenu::onTouchMoved, this);
touchListener->onTouchEnded = CC_CALLBACK_2(MyMenu::onTouchEnded, this);
touchListener->onTouchCancelled = CC_CALLBACK_2(MyMenu::onTouchCancelled, this);

_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);

恩,目前也就了解这些了。以后再继续补吧。

发表评论