Cocos2d-x3.1回调函数详解
来源:互联网 发布:navicat 修改表数据 编辑:程序博客网 时间:2024/05/27 09:44
Cocos2d-x3.1中回调函数的定义在CCRef.h中声明,源码如下:
- typedef void (Ref::*SEL_CallFunc)();
- typedef void (Ref::*SEL_CallFuncN)(Node*);
- typedef void (Ref::*SEL_CallFuncND)(Node*, void*);
- typedef void (Ref::*SEL_CallFuncO)(Ref*);
- typedef void (Ref::*SEL_MenuHandler)(Ref*);
- typedef void (Ref::*SEL_SCHEDULE)(float);
-
- #define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)
- #define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)
- #define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)
- #define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)
- #define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)
- #define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
实际上,这是函数指针的应用。下面使用一个简单的例子来说明函数指针的使用:
- typedef void (*p)(int i);
- void func(int i)
- {
- printf("%d\n",i);
- }
- p = func; p(1);
通过typedef定义了新类型p,p是一个函数指针,函数的参数有一个int值,返回void,p指针可以指向这样的函数。函数名即是一个指针,所以p直接等于func,然后p(1),执行通过这个例子可以发现,Cocos2d-x的回调函数也是这个道理,首先定义了6个函数指针类型,只能指向Ref类的成员函数,然后定义一个定义宏定义,调用这些函数指针,这些宏定义是通过回调对象的CC_Callback_来回调,下面讲一个小例子。
- #include <iostream> //callBack.h
- using namespace std;
-
- class Person
- {
- public:
- void print(string name);
- };
-
- typedef void(Person::*SEL_CallFun)(string str );
-
- class Student : public Person
- {
- private:
- string m_name;
- int m_age;
- public:
- Student(string name ,int age);
- ~Student();
-
- void callBack(string str);
- void result();
- protected:
- Person* m_pListen;
- SEL_CallFun m_pfnSelectior;
- };
- #include "CallBack.h" //callBack.cpp
-
- void Person::print(string name)
- {
- cout << name << endl;
- }
-
- Student::Student(string name ,int age)
- {
- this->m_name = name;
- this->m_age = age;
- }
-
- Student::~Student()
- {
-
- }
-
- void Student::result()
- {
- cout << "Hi this is a student" << endl;
-
- m_pfnSelectior = (SEL_CallFun)(&Student::callBack);
-
- m_pListen = this;
-
- m_pListen->print(m_name);
-
- (m_pListen->*m_pfnSelectior)(m_name);
- }
-
- void Student::callBack(string str)
- {
- cout << "My name is" << str << "age is" << m_age << endl;
- }
- #include <iostream> //main.cpp
- #include "CallBack.h"
- int main(int argc, const char * argv[])
- {
-
-
- Student* s = new Student("YXK",20);
- s->result();
- return 0;
- }
该示例通过Person对象调用子类的回调函数
0 0