转载标明出处:http://blog.csdn.net/notbaron/article/details/38428239
上篇回顾
上篇中,蛤蟆学习CC_CALLBACK的基本原理,虽然不是非常深入,但是应付目前基本够用了。这次我们再学习一个C++11的新特性lambda。是不是没听过?蛤蟆也是第一次听说。那我们赶紧开始吧。
理论介绍
希腊字母表中排序第十一位的字母,英语名称为Lambda。写法是λ。
那在C++上是什么呢?我们先来看下百度百科:
“Lambda 表达式”(lambdaexpression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。”
看,是个匿名函数,匿名就是没有名字。如果小伙伴对命名函数已经厌烦了,那么可以用lambda函数。
我们可以定义这样一个lambda函数,
auto func = [] () { cout << "Hello world"; };
这样得到一个func函数。
[ ] 这个中括号表示要定义lambda表达式了。中间可能会有参数。()小括号是lambda函数的参数列表,然后大括号{}是函数体。
便于我们更好的理解lambda函数。我们介绍一个在[]中间加入&符号的情况。
如果在[]中加入了&符号,说明我们要进行变量截取。什么事变量截取?
蛤蟆觉得就是使用外部变量。
那么蛤蟆介绍下各种变量的截取,
下面是各种变量截取的选项:
[] 不截取任何变量
[&} 截取外部作用域中所有变量,并作为引用在函数体中使用
[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
[=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
[this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
现在我们开始具体的操作步骤。
具体步骤
我们还是在HelloWorld.cpp文件中找到
bool HelloWorld::init()函数,加入如下代码。
auto grossini =Sprite::create("grossini.png");
addChild(grossini,0, 2);
grossini->setPosition(Vec2( 50+origin.x, visibleSize.height/2 + origin.y));
auto action =Sequence::create(
MoveBy::create(1, Vec2(100,0)),
CallFunc::create(
[&](){
auto s = Director::getInstance()->getWinSize();
auto label = Label::createWithTTF("called:lambda callback","fonts/Marker Felt.ttf", 16.0f);
label->setPosition(Vec2(s.width/4*1,s.height/2-40));
this->addChild(label);
} ),
nullptr);
grossini->runAction(action);
运行得到如下图
代码解释
下面我们来解释下代码的含义:
auto grossini =Sprite::create("grossini.png");//创建一个精灵
addChild(grossini,0, 2); //添加一个精灵
grossini->setPosition(Vec2( 50+origin.x, visibleSize.height/2 + origin.y)); //设置精灵位置
auto action =Sequence::create(
MoveBy::create(1, Vec2(100,0)),
CallFunc::create(
[&](){
auto s = Director::getInstance()->getWinSize();
auto label = Label::createWithTTF("called:lambda callback","fonts/Marker Felt.ttf", 16.0f);
label->setPosition(Vec2(s.width/4*1,s.height/2-40));
this->addChild(label);
} ),
nullptr);
//上行中定义动作,其中包括一个CallFunc函数,该函数就是用lambda定义的,其中中括号中有个&符号。表示该lambda函数需要外部的变量. 此处主要是使用this 变量。
grossini->runAction(action);//精灵调用动作。
总结
本次蛤蟆记录lambda函数的原理和在cocos2d-x中具体使用。不知道小伙伴们有没有收获。