閱讀988 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  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這倆參數,舉個例子:

  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)回調函數不帶參數的情況

  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)回調函數帶參數的情況

  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的新的用法(之前的版本應該沒有吧…)

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

以前動作回調都是要新寫一個回調函數,這樣子雖然問題不大,但如果用到回調的地方多了,而且回調的代碼也就幾行而已,那之前的做法就有點受不了,現在好了,可以直接把動作執行完要回調的函數代碼直接寫到創建裏來,是不是方便多了。不是很理解的童鞋可以看下我另外一篇博客https://blog.csdn.net/start530/article/details/19913611

3、觸摸回調,CC_CALLBACK2 這個打算下一篇重點講,所以這個先列下用法。

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

恩,目前也就了解這些了。以後再繼續補吧。
轉載請注明源地址https://blog.csdn.net/start530/article/details/18216679

最後更新:2017-04-03 12:56:06

  上一篇:go Cocos2dx 3.0 過渡篇(三) 觸摸機製
  下一篇:go Cocos2dx 3.0 過渡篇(一) 初體驗