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对象调用子类的回调函数

Cocos2d-x3.1回调函数详解

时间: 2024-10-06 00:12:17

Cocos2d-x3.1回调函数详解的相关文章

Java回调函数详解

为了了解什么是回调函数,在网上查阅了如下资料,整理如下: 资料一: 首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程

Java(Android)回调函数详解

一.前言 本周有位入行开发不久的朋友问我回调究竟是个什么概念,在网上看了很多的回调函数解释,但是越看越乱.虽然回调函数这个梗已经不新鲜了,这里还是用书面的形式记录下. 如果有了解的,就无需再看. 二.概念 概念上,这里引用百度百科的解释,如下: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条

JS中的回调函数详解

function studyEnglish(who){ document.write(who+"学习英语</br>"); } function study(callback,params){ callback(params); } study(studyEnglish,'ck'); //或者 function study(callback,params){ callback(params); } study(function(who){ document.write(who

jQuery 源码解析(八) 异步队列模块 Callbacks 回调函数详解

异步队列用于实现异步任务和回调函数的解耦,为ajax模块.队列模块.ready事件提供基础功能,包含三个部分:Query.Callbacks(flags).jQuery.Deferred(funct)和jQuery.when().本节讲解Callbacks,也就是回调函数列表 回调函数用于管理一组回调函数,支持添加.移除.触发.锁定和禁用回调函数,为jQuery.ajax.jQuery.Deferred()和ready()事件提供基础功能,我们也可以基于它编写新的组件. 使用方法:$.Callb

[应用相关] C 语言回调函数详解

1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B君,有货时通知A君.感觉这个让人更容易想到的是异步操作,而不是回调.另外还有两句英文让我印象深刻:1) If you call me, I will call you back; 2) Don't call me, I will

回调函数详解

回调函就是一个函数调用另一个函数的过程,在编码过程中我们经常会遇到在上一个函数执行完后,才开始执行下一个函数. 下面是代码生成一个div然后让他的左边距增加到100然后停止. function fun1(){ var div =document.createElement('div'); div.style.width = '100px'; div.style.height = '100px'; div.style.background ='red'; document.body.appendC

register_shutdown_function函数详解--脚本退出时执行回调函数

register_shutdown_function — Register a function for execution on shutdown. ps:Registers a callback to be executed after script execution finishes or exit() is called. 1.脚本时常死掉,而且并不总是那么好看.我们可不想给用户显示一个致命错误,又或者一个空白页(在display_errors设为off的情况下) . PHP中有一个叫

Android总结篇系列:Activity中几个主要函数详解

专注Android领域开发. 仰望星空,同时需要脚踏实地. ——好记性不如烂博客 Android总结篇系列:Activity中几个主要函数详解 Activity作为Android系统中四大基本组件之一,包含大量的与其他的各大组件.intent.widget以及系统各项服务等之间的交互的函数.在此,本文主要选取实际项目开发中常用的,但完全理解又需要有一定深入了解的几个函数进行讲解,后续本文会根据需要不断更新. 1. startActivityForResult / onActivityResult

可变参数函数详解

可变参数函数又称参数个数可变函数(本文也简称变参函数),即函数参数数目可变.原型声明格式为: type VarArgFunc(type FixedArg1, type FixedArg2, -); 其中,参数可分为两部分:数目确定的固定参数和数目可变的可选参数.函数至少需要一个固定参数,其声明与普通函数参数相同:可选参数由于数目不定(0个或以上),声明时用"-"表示("-"用作参数占位符).固定参数和可选参数共同构成可变参数函数的参数列表. 由于参数数目不定,使用可