cocos2d-x学习笔记 动作 CCCallFunc家族(回调函数包装器)
??CCCallFunc是CCActionInstant的子類,是非常重要的一個(gè)類族,就是適配器。用大白話說,就是做了一層包裝,把函數(shù)包裝成動(dòng)作,這樣你在執(zhí)行動(dòng)作的時(shí)候,就可以執(zhí)行函數(shù)了。聽起來很怪異嗎?為什么不直接執(zhí)行函數(shù)呢?這是因?yàn)閳?zhí)行條件不同。
?
?
?使用CCCallFunc家族的類
CCCallFunc家族一共有四個(gè)類。這是四個(gè)類對(duì)象的靜態(tài)生成函數(shù):
1. CCCallFunc?*?CCCallFunc::actionWithTarget(SelectorProtocol*?pSelectorTarget,SEL_CallFunc?selector);?
2. CCCallFuncN?*?CCCallFuncN::actionWithTarget(SelectorProtocol*?pSelectorTarget,SEL_CallFuncN?selector);?
3. CCCallFuncND?*?CCCallFuncND::actionWithTarget(SelectorProtocol*?pSelectorTarget,SEL_CallFuncND?selector,?void*?d);?
4. CCCallFuncO?*?CCCallFuncO::actionWithTarget(SelectorProtocol*?pSelectorTarget,SEL_CallFuncO?selector,?CCObject*?pObject)?
我們?cè)趯懙臅r(shí)候,就直接用這四個(gè)生成相關(guān)的動(dòng)作對(duì)象,然后讓節(jié)點(diǎn)執(zhí)行就行。
?
?
?
但是要注意這四個(gè)類,分別對(duì)應(yīng)的是四種不同的函數(shù)接口,也可以說是他包裝了四種不同的回調(diào)函數(shù)。這四個(gè)回調(diào)函數(shù)的不同主要是參數(shù)表的不同。(貌似是廢話)我們來看這四個(gè)回調(diào)函數(shù)的類型定義
1. typedef?void?(SelectorProtocol::*SEL_CallFunc)();?
2. typedef?void?(SelectorProtocol::*SEL_CallFuncN)(CCNode*);?
3. typedef?void?(SelectorProtocol::*SEL_CallFuncND)(CCNode*,?void*);?
4. typedef?void?(SelectorProtocol::*SEL_CallFuncO)(CCObject*);?
這四個(gè)玩意要解釋清楚比較麻煩,這是用typedef定義了類成員函數(shù)指針。如果你對(duì)C++不熟悉,你不需要搞懂具體什么意思,但你必須保證你的函數(shù)簽名和這四個(gè)其中之一一致。
?
也就是說,你自己寫的回調(diào)函數(shù)簽名,看起來像這樣:
1. void?A::f1(?);?
2. void?A::f2(CCNode?*node);//接受一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)是動(dòng)作的執(zhí)行節(jié)點(diǎn)?
3. void?A::f3(CCNode?*node,void?*param);//接受動(dòng)作的執(zhí)行節(jié)點(diǎn),還有一個(gè)void參數(shù)?
4. void?A::f4(CCObject*?obj);//接受一個(gè)CCObject對(duì)象指針?
你可以在回調(diào)函數(shù)里操作這些被傳進(jìn)來的參數(shù)。
?
另外,在用靜態(tài)函數(shù)生成動(dòng)作的時(shí)候,你需要使用一個(gè)宏,來幫助轉(zhuǎn)換函數(shù)指針類型,就是上面那個(gè)callfunc_selector,因?yàn)橛兴姆N類型的回調(diào)函數(shù),所以也就有四個(gè)類型轉(zhuǎn)換宏
1. #define?callfunc_selector(_SELECTOR)?(SEL_CallFunc)(&_SELECTOR)?
2. #define?callfuncN_selector(_SELECTOR)?(SEL_CallFuncN)(&_SELECTOR)?
3. #define?callfuncND_selector(_SELECTOR)?(SEL_CallFuncND)(&_SELECTOR)?
4. #define?callfuncO_selector(_SELECTOR)?(SEL_CallFuncO)(&_SELECTOR)?
下面寫一個(gè)實(shí)例供參考:
?
?
?
?
?
?
轉(zhuǎn)載于:https://blog.51cto.com/lonag/1036143
總結(jié)
以上是生活随笔為你收集整理的cocos2d-x学习笔记 动作 CCCallFunc家族(回调函数包装器)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HttpWatch是强大的网页数据分析工
- 下一篇: 通过ddmlib杀死某个android进