瘸腿蛤蟆笔记17-cocos2d-x-3.2 lambda原理介绍

转载标明出处: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);

运行得到如下图

瘸腿蛤蟆笔记17-cocos2d-x-3.2 lambda原理介绍_第1张图片

 

代码解释

         下面我们来解释下代码的含义:

         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中具体使用。不知道小伙伴们有没有收获。

你可能感兴趣的:(瘸腿蛤蟆笔记17-cocos2d-x-3.2 lambda原理介绍)