您的位置:首页 > 移动开发 > Cocos引擎

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

2016-09-26 18:55 225 查看

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函数体内,调用该精灵时,就会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息