天天看点

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

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

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

1、按钮:cc_callback1

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

2.0  

menuitemimage* item =menuitemimage::create("","",this,menu_selector(helloworld::callback));  

3.0  

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这俩参数,举个例子:

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

item->settarget(this,menu_selector(helloworld::callback));  

item->setcallback(cc_callback1(helloworld::callback,this));  

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

2、action 回调 cc_callback0 ;cc_callback1

先举例:

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

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

callfunc::create(this,callfunc_selector(actionsequence2::callback1));  

void actionsequence2::callback1(){};  

callfunc::create(cc_callback_0(actionsequence2::callback1,this)),  

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

ccsequence* seq = ccsequence::create(  

    moveby::create(2.0f,ccp(150,0)),  

    callfuncn::create(this,callfuncn_selector(actioncallfunc::callback)),  

    null);  

 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);  

} );  

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);  

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

继续阅读