溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何在cocos2d-x中回調(diào)函數(shù)

發(fā)布時(shí)間:2020-06-05 15:43:00 來(lái)源:億速云 閱讀:189 作者:Leah 欄目:游戲開(kāi)發(fā)

這篇文章給大家分享的是在cocos2d-x中回調(diào)函數(shù)的方法,相信大部分人都還沒(méi)學(xué)會(huì)這個(gè)技能,為了讓大家學(xué)會(huì),給大家總結(jié)了以下內(nèi)容,話(huà)不多說(shuō),一起往下看吧。

代碼一

  1. // callback.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5.  
  6. class CCObject{  
  7.  
  8. };  
  9. typedef void (CCObject::*SEL_CallFunc)();//定義一個(gè)CCObject不帶任何實(shí)參的函數(shù)指針SEL_CallFunc  
  10. #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)//僅僅是一個(gè)宏  
  11. class Test{  
  12.     public:  
  13.     void func();  
  14. };  
  15. void Test::func()  
  16. {  
  17.     printf("test->func");  
  18. }  
  19. int _tmain(int argc, _TCHAR* argv[])  
  20. {  
  21.     //創(chuàng)建一個(gè)Test對(duì)象,暫時(shí)沒(méi)用到  
  22.     Test* test = new Test();  
  23.       
  24.     //聲明定義了一個(gè)類(lèi)型為SEL_CallFunc的函數(shù)指針f,然后用f指針指向Test::func函數(shù)  
  25.     SEL_CallFunc f = callfunc_selector(Test::func);  
  26.     //上面一句替換宏后等價(jià)于SEL_CallFunc f = SEL_CallFunc)(&Test::func);  
  27.       
  28.     //創(chuàng)建一個(gè)CCObject對(duì)象  
  29.     CCObject* obj = new CCObject();  
  30.     //調(diào)用執(zhí)行Test::func函數(shù)  
  31.     (obj->*f)();  
  32.  
  33.     getchar();  
  34.     delete test;  
  35.     delete obj;  
  36.     return 0;  
  37. }  
  38.  

運(yùn)行結(jié)果:

如何在cocos2d-x中回調(diào)函數(shù) 

結(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)詭異- -  反正記住能這么干就好了

代碼二:

為了凸顯新增加的代碼,之前的注釋就刪掉了。

  1. // callback.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5.  
  6. class CCObject{  
  7.  
  8. };  
  9. typedef void (CCObject::*SEL_CallFunc)();  
  10. #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)  
  11. class Test{  
  12.     public:  
  13.     int value;//增加公開(kāi)的成員變量value  
  14.     public:  
  15.     void func();  
  16. };  
  17. void Test::func()  
  18. {  
  19.     printf("test->func value:%d",value); //打印value  
  20. }  
  21. int _tmain(int argc, _TCHAR* argv[])  
  22. {  
  23.     Test* test = new Test();  
  24.     test->value = 100;//賦值100  
  25.     SEL_CallFunc f = callfunc_selector(Test::func);  
  26.     CCObject* obj = new CCObject();  
  27.     (obj->*f)();  
  28.  
  29.     getchar();  
  30.     delete test;  
  31.     delete obj;  
  32.     return 0;  
  33. }  
  34.  

運(yùn)行結(jié)果:

如何在cocos2d-x中回調(diào)函數(shù) 

結(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)系。代碼三給出方案。

代碼三

  1. // callback.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5.  
  6. class CCObject{  
  7.  
  8. };  
  9. typedef void (CCObject::*SEL_CallFunc)();  
  10. #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)  
  11. class Test:public CCObject{//繼承與CCObject  
  12.     public:  
  13.     int value;  
  14.     public:  
  15.     void func();  
  16. };  
  17. void Test::func()  
  18. {  
  19.     printf("test->func value:%d",value);   
  20. }  
  21. int _tmain(int argc, _TCHAR* argv[])  
  22. {  
  23.     Test* test = new Test();  
  24.     test->value = 100;  
  25.     SEL_CallFunc f = callfunc_selector(Test::func);  
  26.     //CCObject* obj = new CCObject();  
  27.     (test->*f)();//采用test對(duì)象去調(diào)用  
  28.  
  29.     getchar();  
  30.     delete test;  
  31.     //delete obj;  
  32.     return 0;  
  33. }  
  34.  

結(jié)果:

如何在cocos2d-x中回調(diào)函數(shù) 

結(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ò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI