溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在cocos2d-x中回調函數

發布時間:2020-06-05 15:43:00 來源:億速云 閱讀:194 作者:Leah 欄目:游戲開發

這篇文章給大家分享的是在cocos2d-x中回調函數的方法,相信大部分人都還沒學會這個技能,為了讓大家學會,給大家總結了以下內容,話不多說,一起往下看吧。

代碼一

  1. // callback.cpp : 定義控制臺應用程序的入口點。  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5.  
  6. class CCObject{  
  7.  
  8. };  
  9. typedef void (CCObject::*SEL_CallFunc)();//定義一個CCObject不帶任何實參的函數指針SEL_CallFunc  
  10. #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)//僅僅是一個宏  
  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.     //創建一個Test對象,暫時沒用到  
  22.     Test* test = new Test();  
  23.       
  24.     //聲明定義了一個類型為SEL_CallFunc的函數指針f,然后用f指針指向Test::func函數  
  25.     SEL_CallFunc f = callfunc_selector(Test::func);  
  26.     //上面一句替換宏后等價于SEL_CallFunc f = SEL_CallFunc)(&Test::func);  
  27.       
  28.     //創建一個CCObject對象  
  29.     CCObject* obj = new CCObject();  
  30.     //調用執行Test::func函數  
  31.     (obj->*f)();  
  32.  
  33.     getchar();  
  34.     delete test;  
  35.     delete obj;  
  36.     return 0;  
  37. }  
  38.  

運行結果:

如何在cocos2d-x中回調函數 

結果分析:

1.我們有一個CCObject類

2.我們可以通過這種方法typedef void (CCObject::*SEL_CallFunc)();來定義一個CCObject類的函數指針類型 SEL_CallFunc

3.我們定義了一個SEL_CallFunc的指針變量f

4.假定我們有一個類Test,里面有個函數func(),它的返回值和實參都與SEL_CallFunc一致,那么我們可以通過如下方法去調用這個函數.

 SEL_CallFunc f = callfunc_selector(Test::func);
 CCObject* obj = new CCObject();
 (obj->*f)();

總之我覺得這看起來有點詭異- -  反正記住能這么干就好了

代碼二:

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

  1. // callback.cpp : 定義控制臺應用程序的入口點。  
  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;//增加公開的成員變量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.  

運行結果:

如何在cocos2d-x中回調函數 

結果分析:

我在Test類里增加了成員變量value,并且給它賦值100,同時在func函數里把它打印出來。與代碼一一樣的方法來調用func函數,怎么說呢,value打印出來的值不是100而是-33686272,說明它不知道把哪塊內存空間里的值給打印出來了。這跟我預想的應該是一樣的,畢竟我們從頭到尾都沒有用到過test這個對象- -如果能打印出100那就更怪異了。那怎么才能打印出test里的成員呢,按邏輯,那一定跟Test類的具體對象有關系。代碼三給出方案。

代碼三

  1. // callback.cpp : 定義控制臺應用程序的入口點。  
  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對象去調用  
  28.  
  29.     getchar();  
  30.     delete test;  
  31.     //delete obj;  
  32.     return 0;  
  33. }  
  34.  

結果:

如何在cocos2d-x中回調函數 

結果分析:

  好了,成功打印出了value。

  1.讓Test繼承CCObject

  2.不再用CCObject的一個對象obj去調用f而是改成Test的一個對象test去調用f

PS:如果采用以下方法去調用也是可以打印出value

CCObject* obj = test;
(obj->*f)();

PS:cocos2d-x的類都是繼承與CCObject

關于在cocos2d-x中回調函數的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女