您好,登錄后才能下訂單哦!
這篇文章給大家分享的是在cocos2d-x中回調(diào)函數(shù)的方法,相信大部分人都還沒(méi)學(xué)會(huì)這個(gè)技能,為了讓大家學(xué)會(huì),給大家總結(jié)了以下內(nèi)容,話(huà)不多說(shuō),一起往下看吧。
代碼一
- // callback.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
- //
- #include "stdafx.h"
- class CCObject{
- };
- typedef void (CCObject::*SEL_CallFunc)();//定義一個(gè)CCObject不帶任何實(shí)參的函數(shù)指針SEL_CallFunc
- #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)//僅僅是一個(gè)宏
- class Test{
- public:
- void func();
- };
- void Test::func()
- {
- printf("test->func");
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- //創(chuàng)建一個(gè)Test對(duì)象,暫時(shí)沒(méi)用到
- Test* test = new Test();
- //聲明定義了一個(gè)類(lèi)型為SEL_CallFunc的函數(shù)指針f,然后用f指針指向Test::func函數(shù)
- SEL_CallFunc f = callfunc_selector(Test::func);
- //上面一句替換宏后等價(jià)于SEL_CallFunc f = SEL_CallFunc)(&Test::func);
- //創(chuàng)建一個(gè)CCObject對(duì)象
- CCObject* obj = new CCObject();
- //調(diào)用執(zhí)行Test::func函數(shù)
- (obj->*f)();
- getchar();
- delete test;
- delete obj;
- return 0;
- }
運(yùn)行結(jié)果:
結(jié)果分析:
1.我們有一個(gè)CCObject類(lèi)
2.我們可以通過(guò)這種方法typedef void (CCObject::*SEL_CallFunc)();來(lái)定義一個(gè)CCObject類(lèi)的函數(shù)指針類(lèi)型 SEL_CallFunc
3.我們定義了一個(gè)SEL_CallFunc的指針變量f
4.假定我們有一個(gè)類(lèi)Test,里面有個(gè)函數(shù)func(),它的返回值和實(shí)參都與SEL_CallFunc一致,那么我們可以通過(guò)如下方法去調(diào)用這個(gè)函數(shù).
SEL_CallFunc f = callfunc_selector(Test::func);
CCObject* obj = new CCObject();
(obj->*f)();
總之我覺(jué)得這看起來(lái)有點(diǎn)詭異- - 反正記住能這么干就好了
代碼二:
為了凸顯新增加的代碼,之前的注釋就刪掉了。
- // callback.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
- //
- #include "stdafx.h"
- class CCObject{
- };
- typedef void (CCObject::*SEL_CallFunc)();
- #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)
- class Test{
- public:
- int value;//增加公開(kāi)的成員變量value
- public:
- void func();
- };
- void Test::func()
- {
- printf("test->func value:%d",value); //打印value
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Test* test = new Test();
- test->value = 100;//賦值100
- SEL_CallFunc f = callfunc_selector(Test::func);
- CCObject* obj = new CCObject();
- (obj->*f)();
- getchar();
- delete test;
- delete obj;
- return 0;
- }
運(yùn)行結(jié)果:
結(jié)果分析:
我在Test類(lèi)里增加了成員變量value,并且給它賦值100,同時(shí)在func函數(shù)里把它打印出來(lái)。與代碼一一樣的方法來(lái)調(diào)用func函數(shù),怎么說(shuō)呢,value打印出來(lái)的值不是100而是-33686272,說(shuō)明它不知道把哪塊內(nèi)存空間里的值給打印出來(lái)了。這跟我預(yù)想的應(yīng)該是一樣的,畢竟我們從頭到尾都沒(méi)有用到過(guò)test這個(gè)對(duì)象- -如果能打印出100那就更怪異了。那怎么才能打印出test里的成員呢,按邏輯,那一定跟Test類(lèi)的具體對(duì)象有關(guān)系。代碼三給出方案。
代碼三
- // callback.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
- //
- #include "stdafx.h"
- class CCObject{
- };
- typedef void (CCObject::*SEL_CallFunc)();
- #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)
- class Test:public CCObject{//繼承與CCObject
- public:
- int value;
- public:
- void func();
- };
- void Test::func()
- {
- printf("test->func value:%d",value);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Test* test = new Test();
- test->value = 100;
- SEL_CallFunc f = callfunc_selector(Test::func);
- //CCObject* obj = new CCObject();
- (test->*f)();//采用test對(duì)象去調(diào)用
- getchar();
- delete test;
- //delete obj;
- return 0;
- }
結(jié)果:
結(jié)果分析:
好了,成功打印出了value。
1.讓Test繼承CCObject
2.不再用CCObject的一個(gè)對(duì)象obj去調(diào)用f而是改成Test的一個(gè)對(duì)象test去調(diào)用f
PS:如果采用以下方法去調(diào)用也是可以打印出value
CCObject* obj = test;
(obj->*f)();
PS:cocos2d-x的類(lèi)都是繼承與CCObject
關(guān)于在cocos2d-x中回調(diào)函數(shù)的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。