Cocos2dx 3.0 過渡篇(二) 事件回調
尊重原創,轉載請注明來自:star特530的CSDN博客 https://blog.csdn.net/start530/article/details/18216679
3.0 後的事件回調函數接口都不一樣了,例如按鈕的menu_selector(),update的 schedule_selector等,都已成明日黃花。而新的回調接口,則由四個CC_CALLBACK取代。
下麵先舉例一些不同的調用方法:
1、按鈕:CC_CALLBACK1
- 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這倆參數,舉個例子:
- 2.0
- Item->setTarget(this,menu_selector(HelloWorld::callback));
- 3.0
- Item->setCallback(CC_CALLBACK1(HelloWorld::callback,this));
恩,就是這樣子,怎麼感覺說的都沒啥深度,噗,有點模仿“笨木頭”的語氣呀。
2、action 回調 CC_CALLBACK0 ;CC_CALLBACK1
先舉例:
1)回調函數不帶參數的情況
- 2.0
- CallFunc::create(this,callfunc_selector(ActionSequence2::callback1));
- void ActionSequence2::callback1(){};
- 3.0
- CallFunc::create(CC_CALLBACK_0(ActionSequence2::callback1,this)),
- void ActionSequence2::callback1(){};
2)回調函數帶參數的情況
- 2.0
- CCSequence* seq = CCSequence::create(
- MoveBy::create(2.0f,ccp(150,0)),
- CallFuncN::create(this,callfuncN_selector(ActionCallFunc::callback)),
- NULL);
- 3.0
- 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);
- } );
以前動作回調都是要新寫一個回調函數,這樣子雖然問題不大,但如果用到回調的地方多了,而且回調的代碼也就幾行而已,那之前的做法就有點受不了,現在好了,可以直接把動作執行完要回調的函數代碼直接寫到創建裏來,是不是方便多了。不是很理解的童鞋可以看下我另外一篇博客:https://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);
恩,目前也就了解這些了。以後再繼續補吧。
轉載請注明源地址:https://blog.csdn.net/start530/article/details/18216679
最後更新:2017-04-03 12:56:06