cocos2dx中的回撥函式CC_CALLBACK_*
阿新 • • 發佈:2019-02-15
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);