Cocos2d-x3.1回调函数详解

来源:互联网 发布:navicat 修改表数据 编辑:程序博客网 时间:2024/05/27 09:44

Cocos2d-x3.1中回调函数的定义在CCRef.h中声明,源码如下:

[cpp] view plain copy
  1. typedef void (Ref::*SEL_CallFunc)();  
  2. typedef void (Ref::*SEL_CallFuncN)(Node*);  
  3. typedef void (Ref::*SEL_CallFuncND)(Node*, void*);  
  4. typedef void (Ref::*SEL_CallFuncO)(Ref*);  
  5. typedef void (Ref::*SEL_MenuHandler)(Ref*);  
  6. typedef void (Ref::*SEL_SCHEDULE)(float);  
  7.   
  8. #define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)  
  9. #define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)  
  10. #define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)  
  11. #define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)  
  12. #define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)  
  13. #define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)  

实际上,这是函数指针的应用。下面使用一个简单的例子来说明函数指针的使用:

[cpp] view plain copy
  1. typedef void (*p)(int i);  
  2. void func(int i)  
  3. {  
  4.     printf("%d\n",i);  
  5. }  
  6. p = func;  p(1);  
通过typedef定义了新类型p,p是一个函数指针,函数的参数有一个int值,返回void,p指针可以指向这样的函数。函数名即是一个指针,所以p直接等于func,然后p(1),执行

通过这个例子可以发现,Cocos2d-x的回调函数也是这个道理,首先定义了6个函数指针类型,只能指向Ref类的成员函数,然后定义一个定义宏定义,调用这些函数指针,这些宏定义是通过回调对象的CC_Callback_来回调,下面讲一个小例子。

[cpp] view plain copy
  1. #include <iostream>  //callBack.h  
  2. using namespace std;  
  3. //定义一个基类  
  4. class Person  
  5. {  
  6. public:  
  7.     void print(string name);//定义基类方法  
  8. };  
  9. //typedef一个函数指针类型  
  10. typedef void(Person::*SEL_CallFun)(string str );  
  11. //定义一个派生类  
  12. class Student : public Person  
  13. {  
  14. private:  
  15.     string m_name;  
  16.     int m_age;  
  17. public:  
  18.     Student(string name ,int age);  
  19.     ~Student();  
  20.       
  21.     void callBack(string str);//定义一个回调函数  
  22.     void result();//打印结果  
  23. protected:  
  24.     Person* m_pListen;//回调函数的执行对象  
  25.     SEL_CallFun m_pfnSelectior;//回调函数指针  
  26. };  

[cpp] view plain copy
  1. #include "CallBack.h"  //callBack.cpp  
  2. //定义一个基类  
  3. void Person::print(string name)  
  4. {  
  5.     cout << name << endl;  
  6. }  
  7.   
  8. Student::Student(string name ,int age)  
  9. {  
  10.     this->m_name = name;  
  11.     this->m_age = age;  
  12. }  
  13.   
  14. Student::~Student()  
  15. {  
  16.       
  17. }  
  18.   
  19. void Student::result()  
  20. {  
  21.     cout << "Hi this is a student" << endl;  
  22.       
  23.     m_pfnSelectior = (SEL_CallFun)(&Student::callBack);//先将子类的回调函数转成函数指针  
  24.       
  25.     m_pListen = this;//执行对象是this  
  26.       
  27.     m_pListen->print(m_name);//首先执行父类的print函数  
  28.       
  29.     (m_pListen->*m_pfnSelectior)(m_name);//执行回调函数,即子类的callBack函数  
  30. }  
  31.   
  32. void Student::callBack(string str)  
  33. {  
  34.     cout << "My name is" << str << "age is" << m_age << endl;  
  35. }  
[cpp] view plain copy
  1. #include <iostream> //main.cpp  
  2. #include "CallBack.h"  
  3. int main(int argc, const char * argv[])  
  4. {  
  5.   
  6.     // insert code here...  
  7.     Student* s = new Student("YXK",20);  
  8.     s->result();  
  9.     return 0;  
  10. }  

该示例通过Person对象调用子类的回调函数

0 0