Cocos2d-x3.6回调函数详解
2015-10-05 23:08
429 查看
Cocos2d-x3.6中回调函数的定义在CCRef.h中声明,源码如下:
实际上,这是函数指针的应用。下面使用一个简单的例子来说明函数指针的使用:
通过typedef定义了新类型p,p是一个函数指针,函数的参数有一个int值,返回void,p指针可以指向这样的函数。函数名即是一个指针,所以p直接等于func,然后p(1),执行
通过这个例子可以发现,Cocos2d-x的回调函数也是这个道理,首先定义了6个函数指针类型,只能指向Ref类的成员函数,然后定义一个定义宏定义,调用这些函数指针,这些宏定义是通过回调对象的CC_Callback_来回调,下面讲一个小例子。
该示例通过Person对象调用子类的回调函数
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一个函数指针类型 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;//执行对象是this m_pListen->print(m_name);//首先执行父类的print函数 (m_pListen->*m_pfnSelectior)(m_name);//执行回调函数,即子类的callBack函数 } 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[]) { // insert code here... Student* s = new Student("YXK",20); s->result(); return 0; }
该示例通过Person对象调用子类的回调函数
相关文章推荐
- cocos2d - 粒子系统工具(Particle Designer)
- cocos代码研究(8)持续动作子类学习笔记
- Cocos2d-x Box2D物理引擎编译设置
- cocos3——8.实现初学者指南
- cocos代码研究(7)即时动作子类学习笔记
- Cocos2d-x 开发环境搭建
- cocos代码研究(6)有限时间动作类(FiniteTimeAction)学习笔记
- cocos代码研究(5)Action学习笔记
- Cocos2d-x游戏 技能冷去 时间进度
- Cocos2D的随机数生成函数
- Cocos2D的随机数生成函数
- Cocos2D的随机数生成函数
- cocos2dx 帧动画
- Cocos2D的OALSimpleAudio预加载音频
- Cocos2D的OALSimpleAudio预加载音频
- Cocos2D的OALSimpleAudio预加载音频
- cocos compile 没有安装可用的 JDK("No valid JDK installed.")
- Cocos2D中的ObjectAL简介
- Cocos2D中的ObjectAL简介
- Cocos2D中的ObjectAL简介