Cocos2d-x3.1回调函数具体解释

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一个函数指针类型
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对象回调函数的子类

时间: 2024-11-05 21:51:58

Cocos2d-x3.1回调函数具体解释的相关文章

js中的回调函数的理解和使用方法

一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为函数实际上是一种对象,它可以存储在变量中,通过参数传递给另一个函数,在函数内部创建,从函数中返回结果值",因为函数是内置对象,我们可以将它作为参数传递给另一个函数,到函数中执行,甚至执行后将它返回,它一直被"专业的程序员"看作是一种难懂的技术. 回调函数的英文解释为: A callback is a functi

Python回调函数用法实例详解

本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 二.什么是回调: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用

js中的回调函数,什么是回调函数?

一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为函数实际上是一种对象,即是内置对象,它可以存储在变量中,通过参数传递给另一个函数,我们可以将它作为参数传递给另一个函数,到函数中执行,甚至执行后将它返回,它一直被"专业的程序员"看作是一种难懂的技术. 回调函数的英文解释为: A callback is a function that is passed as an arg

回调函数的应用误区3(大彻大悟的回调小程序,例子的解释相当给力)

研究了一段时间回调函数,越看越迷惑,分析并改进了从网上看到的几篇好文,看过后有了自己的看法.我也不知道这些跌跌撞撞的认识是否符合回调的真实原理,若有大侠能帮解惑,自当感激不尽. 下面的代码可以在Vs2008下编译并运行: 所有的回调函数文章里,能让我一下看明白回调函数的就是这篇文章了,描述简单,一语中的:http://hi.baidu.com/zht7216/item/1dd32e82a68c40d15f0ec154 摘选如下: 函数指针是一个指向函数的指针变量,它是专门来存放函数入口地址的,在

一句话解释回调函数

很多人都听说过“回调函数”这个物件,很多人也都明白,也有一部分像我这样的人不明白.今天吃饭的时候突然明白,说白就是一句话:传一个函数指针 就是一个函数,它的一个参数是一个函数指针. 1 return_value func(func_ptr){ 2 ......... 3 } #include <iostream> using namespace std; int generateOdd(int i){ return 2*i+1; } int print(int(*p)(int i),int K

cocos2d-x 2.2.0 怎样在lua中注冊回调函数给C++

cocos2d-x内部使用tolua进行lua绑定.可是引擎并没有提供一个通用的接口让我们能够把一个lua函数注冊给C++层面的回调事件. 翻看引擎的lua绑定代码,我们能够仿照引擎中的方法来做. 值得吐槽的是.这套流程在开发中差点儿是不可避免的,而cocos2d-x居然不把它作为一个公用接口暴露给开发人员,而须要我自己动手,真是无奈. 以下以一个简单的消息分发类为样例,演示怎样完毕这一工作. MessageDispatcher.h class MessageDispather { public

【Cocos2d-x 3.0 基础系列一】 各类回调函数写法汇总

一.button回调 1. Lambda 表达式,C++11 Lambda 赋予了Cocos2d-x 3.0创建回调函数的灵活性. auto itemNor = Sprite::create("CloseNormal.png"); auto menuItem = MenuItemSprite::create(itemNor,nullptr,nullptr,[](Ref* sender) { log("show this msg."); }); auto menu =

函数指针和回调函数

函数指针 函数指针是指向函数调用地址的指针.它和函数名究竟有什么关系呢?且看下文. 且看一小程序 首先,先请看下边程序: 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 void func(string s) 6 { 7 cout << s << endl; 8 } 9 10 void (*pFunc)(string s); // 不能够写成 void *pFunc(s

动作回调函数 (CallFunc,CallFuncN,CCCallFuncND)

动作回调函数 (例子) 1 bool HelloWorld::init() 2 { 3 ////////////////////////////// 4 // 1. super init first 5 if ( !Layer::init() ) 6 { 7 return false; 8 } 9 10 Size visibleSize = Director::getInstance()->getVisibleSize(); 11 Vec2 origin = Director::getInsta