1. 程式人生 > >cocos2dx中的回撥函式CC_CALLBACK_*

cocos2dx中的回撥函式CC_CALLBACK_*

cocos2dx對CC_CALLBACK_*使用了std::bind進行函式適配

// new callbacks based on C++11
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__) #define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

__selector__:回撥函式指標
__target__:回撥物件指標
##__VA_ARGS__:可變引數列表
std::placeholders::_1:不定引數1,呼叫時由呼叫函式的引數傳入
std::placeholders::_2:不定引數2,呼叫時由呼叫函式的引數傳入
std::placeholders::_3:不定引數3,呼叫時由呼叫函式的引數傳入

CC_CALLBACK_0:不帶任何不定引數

//動作函式
CallFunc::create ( CC_CALLBACK_0(HelloWorld::callback0, this) );
//回撥函式
void HelloWorld::callback0
() { }

CC_CALLBACK_1:帶有一個不定引數

//動作回撥函式
CallFuncN::create( CC_CALLBACK_1(HelloWorld::callback1, this) );
void HelloWorld::callback1(Node* node) { }//一個不定引數
//選單回撥函式
MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
void HelloWorld::menuCloseCallback(Node* sender) { }

CC_CALLBACK_2:帶有兩個不定引數

auto listener = EventListenerTouchOneByOne::create();

//繫結事件
listener ->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
listener ->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
listener ->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);

//回撥函式
virtual bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event); //兩個不定引數
virtual void HelloWorld::onTouchMoved(Touch *touch, Event *unused_event); 
virtual void HelloWorld::onTouchEnded(Touch *touch, Event *unused_event);

最後,CC_CALLBACK_*函式可以帶任意自定義引數:
即可以加入##__VA_ARGS__:可變引數列表

 auto closeItem = MenuItemImage::create(  "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this,2,0.5));
void HelloWorld::menuCloseCallback(Ref* pSender,int a, float b);