如何在cocos2d-x中回调函数
更新:HHH   时间:2023-1-7


这篇文章给大家分享的是在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.  

运行结果:

 

结果分析:

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.  

运行结果:

 

结果分析:

我在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.  

结果:

 

结果分析:

  好了,成功打印出了value。

  1.让Test继承CCObject

  2.不再用CCObject的一个对象obj去调用f而是改成Test的一个对象test去调用f

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

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

PS:cocos2d-x的类都是继承与CCObject

关于在cocos2d-x中回调函数的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

返回游戏开发教程...