Cocos2d-x3.6回调函数详解

Cocos2d-x3.6回调函数详解,第1张

概述Cocos2d-x3.6中回调函数的定义在CCRef.h中声明,源码如下: typedef void (Ref::*SEL_CallFunc)();typedef void (Ref::*SEL_CallFuncN)(Node*);typedef void (Ref::*SEL_CallFuncND)(Node*, void*);typedef void (Ref::*SEL_CallFun

Cocos2d-x3.6中回调函数的定义在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.husing 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(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){  "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-x3.6回调函数详解全部内容,希望文章能够帮你解决Cocos2d-x3.6回调函数详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1072037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存