cocos2d3.10 简单引用lambda表达式用作回调函数

1.匿名函数 出现在 matlab 中。它是matlab中定义的一种函数形式。

2.匿名函数只具备函数体 没有函数名称

因为它只在此处使用 并且不需要在其他地方调用它,那么名称也就没有意义

3.匿名函数不以文件形式驻留在文件夹上;他的生成方式最简捷,可在指令窗或任何函数体内通过指令直接生成。

匿名函数的作用:主要实现自己定义matlab中的函数,从而扩大函数的使用功能
和内联函数(inline)相比,匿名函数的优越性在于可以直接使用workspace中的变量,不必申明,非常适合嵌入到M文件中。

4.lambda表达式

[] () {};
只有三个对符号和一个分号,分号的作用是:
[]符号,表示要开始一个lambda函数;
()符号,填写函数的参数;
{}符号,(存放代码块);
;符号 不解释;

5.动作完成后的回调函数(引用lambda表达式):

bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    //官方默认
    auto rootNode = CSLoader::createNode("MainScene.csb");
    addChild(rootNode);
    //1.添加一个精灵
    Sprite* runSpr = Sprite::create("CloseNormal.png");
    runSpr->setPosition(Vec2(200,100));
    addChild(runSpr);

    //2.给精灵添加一个动作
    MoveTo* runSpr_move = MoveTo::create(1.5,Vec2(500, 300));

    //3.执行完动作给一个动作回调(用lambda表达式)
    auto callFunc = [](){
        printf("动作执行完了!");
    };
    CallFunc* func = CallFunc::create(callFunc);

    //4.动作执行(执行完动作,再执行回调函数)
    Sequence* runSpr_action = Sequence::create(runSpr_move, func, NULL);
    runSpr->runAction(runSpr_action);
}   

6.如果需要该精灵(runSprite)在回调函数内隐藏

需要修改:

//3.执行完动作给一个动作回调(用lambda表达式)
    auto callFunc = [=](){        //注意这里[]修改为了[=]
        printf("动作执行完了!");
        //隐藏精灵
        runSpr->setVisble(false);
    };

为什么把[]修改为[ = ]:

[]:   不截取任何变量;
[&]:   截取外部作用域中所有变量,并作为引用在函数体中使用,可以简单地理解为,只要变量没有被释放,那么在lambda函数中都可以使用。但是局部变量不可以使用,因为局部变量会被释放;
[=]:   截取外部作用域中所有变量,并拷贝一份在函数体中使用,即使外部变量的值改变了,但是在lambda函数执行的时候,依旧是复制时的值。
[=, &foo]:  截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[foo]:   截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
[this]:  截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

为什么不用[&]?
这里创建的精灵是在init()函数内部创建的,属于局部变量。此函数执行完毕,精灵就会被释放掉!
[&]:截取外部作用域中所有变量,并作为引用在函数体中使用。当lambda函数体内,调用该精灵时,就会报错。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值