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

来源:互联网 发布:淘宝小二介入订单关闭 编辑:程序博客网 时间:2024/05/19 22:27

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函数体内,调用该精灵时,就会报错。

0 0
原创粉丝点击