zoukankan      html  css  js  c++  java
  • Cocos2d-x中的CC_CALLBACK_X详解

    Cocos2d-x 3.x版本用CC_CALLBACK_0,CC_CALLBACK_1,CC_CALLBACK_2和CC_CALLBACK_3的宏来定义回调方法类的。

    3.x版本的例子:

    child->runAction(Sequence::create(
                                        DelayTime::create(1.4f),
                                        CallFunc::create( CC_CALLBACK_0(CrashTest::removeThis,this)),
                                        nullptr)
                 );

    这里的含义就是child执行了一个Action,这个Action是一个队列,队列的第一个执行是一个延时操作,第二个执行是一个回调。意思就是经过1.4秒后调用this对象的removeThis方法。

    CC_CALLBACK_0中有两个参数,第一个是要回调的方法名称,用类名加方法的形式,第二个参数是函数被调用的对象的指针,一般是this。

    很多人认为CC_CALLBACK_0中的0是代表回调的removeThis方法的参数是0个的意思,其实并不是。

    看下面的例子:

    auto action = Sequence::create(
            Place::create(Vec2(200,200)),
            Show::create(),
            MoveBy::create(1, Vec2(100,0)),
            CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback1,this)),
            CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback2,this,_grossini)),
            CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback3,this,_grossini,0xbebabeba)),
            nullptr);
    void ActionSequence2::callback1()
    void ActionSequence2::callback2(Node* sender)
    void ActionSequence2::callback3(Node* sender, long data)

    这里的三个CC_CALLBACK_0的参数列表中,除了第一个回调的方法和第二个调用的对象,第二个CC_CALLBACK_0中多了一个参数_grossini,这个变量在回调ActionSequence2::callback2方法时作为参数使用,ActionSequence2::callback2(_grossini)。同样的ActionSequence2::callback3方法调用时的参数是_grossini和0xbebabeba,ActionSequence2::callback3(_grossini,0xbebabeba)。

    CC_CALLBACK_0中的0是代表要回调的方法绑定第0个参数之后的参数。

    ActionSequence2::callback2第0个后面的参数就是_grossini,那么_grossini就是第1个参数,调用就是ActionSequence2::callback2(_grossini)这个样子。

    那么, 同样的道理CC_CALLBACK_1,2,3就代表回调的方法绑定第1,2,3个参数之后的参数。

    我们再看个例子:

    // Get 
        auto labelGet = Label::createWithTTF("Test Get", "fonts/arial.ttf", 22);
        auto itemGet = MenuItemLabel::create(labelGet, CC_CALLBACK_1(HttpClientTest::onMenuGetTestClicked, this, false));
        itemGet->setPosition(LEFT, winSize.height - MARGIN - SPACE);
        menuRequest->addChild(itemGet);
    void HttpClientTest::onMenuGetTestClicked(cocos2d::Ref *sender, bool isImmediate)

    这里的CC_CALLBACK_1有三个参数,前两个就不多说了,第三个参数fasle就是回调函数onMenuGetTestClicked中的第1个参数之后的参数,也就是第二个参数。

    这个回调在调用的地方是这样:

    _callback(this);

    调用的时候只需要第一个参数,而第二个参数会被指定为false。

    举一个很容易理解的例子:

    int add (int a, int b)
    {
    return a+b;
    }
    
    auto func = CC_CALLLBACK_1(add, this, 2);
    
    cout << func(3) << endl; // 结果是 5

    func是一个回调方法,默认指定了第二个参数是2,调用的时候只需要指定第一个参数就可以了。

    说完CC_CALLBACK的用法,再看看CC_CALLBACK这个宏的定义:

    // new callbacks based on C++11
    #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
    #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
    #define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
    #define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

    C++11引入了boost库的function和bind,bind也被3.x版本用来作为回调的绑定。

    __selector__是绑定回调的方法

    __target__是调用方法的对象

    ##__VA_ARGS__是可变的参数列表

    std::placeholders::_1是占位符

    std::placeholders::_2同上是占位符

  • 相关阅读:
    centos 6.5 下安装RabbitMQ-3.7.28 二进制版本
    Centos 6.5 Rabbitmq 安装和集群,镜像部署
    Vim 自动添加脚本头部信息
    vim 手动添加脚本头部信息
    Pandas系列教程(11)Pandas的索引index
    Pandas系列教程(10)Pandas的axis参数
    Pandas系列教程(9)Pandas字符串处理
    Pandas系列教程(8)pandas数据排序
    Pandas系列教程(7)Pandas的SettingWithCopyWarning
    Pandas系列教程(6)Pandas缺失值处理
  • 原文地址:https://www.cnblogs.com/andyidea/p/4837417.html
Copyright © 2011-2022 走看看