cocos2dx中如何使用lamda表达式

转自--http://blog.csdn.net/snowlyday/article/details/45973379

在很多时候使用cocos2dx开发游戏的时候经常要创建一个连续的序列,比如创建一个连续的动作,而往往在连续的动作结束后需要执行一个函数来

 让代码知晓动作执行结束。一般的方法是创建一个回调函数如下所示

[cpp]  view plain  copy
 print ?
  1. auto jump = JumpBy::create(jumpTime, Vec2(0, 0), tempJumpPos.y, 1);  
  2. auto dely = DelayTime::create(jumpTime/2);  
  3. auto seq = Sequence::create(dely, CallFunc::create(this, callfunc_selector(Player::jumpHalf)), NULL);  
  4. auto spa = Spawn::create(jump, seq, NULL);  
  5. spa->setTag(100);  
  6. this->runAction(spa);  


 这个就是使用回调函数在动作结束的时候让代码知晓动作结束,然而如果在jumpHalf函数中只是仅仅需要一行语句呢??这个样的话写一个函数就有点

浪费了。那么这个时候就可以使用一个lamda表达式。


 那么来看一个执行完动作之后删除自身的一个例子。

[cpp]  view plain  copy
 print ?
  1. void FloatWord::floatOut(const float delay,std::function<void()> callback){  
  2.     Size visibleSize = Director::getInstance()->getVisibleSize();  
  3.     MoveTo* move = MoveTo::create(delay,Point(0,_begin.y));  
  4.     CallFunc* call = CallFunc::create(callback);  
  5.     int key = 10;  
  6.   
  7.     CallFunc* removeC = CallFunc::create([this](){  
  8.         this->removeFromParentAndCleanup(true);  
  9.     });  
  10.     Sequence* action = Sequence::create(move,call,removeC,NULL);  
  11.     _label->runAction(action);  
  12. }  

这个例子是写的一个让飘飞的字体,,在飘出界面的时候自己将自己删除。

在上面的代码中使用到了lamda函数 ::[capture](parameters){body}

capture:需要用到的外部变量,parameters:函数参数;body:函数体

也就是说上面的代码中  [this] 这个this是传入的一个参数,如果没有这个this的参数那么this->removeFrom......就没法使用了。capture 是表示在lamda中需要使用到的

外部变量 比如 上面的代码中如果上述的 lamda要使用key的值,,不将key写在lamda的捕获参数表中是无法使用key的值的,那么我们需要的就是修改代码如下


[cpp]  view plain  copy
 print ?
  1. CallFunc* removeC = CallFunc::create([this,key](){  
  2.   
  3.         auto i = key;  
  4.         this->removeFromParentAndCleanup(true);  
  5.     });  

这个样的话就可以使用到key  的值了。关于捕获变量方面:

C++要求我们在Lambda的捕获子句里显式指定想要捕获的变量,否则无法在函数体里使用这些变量。如果捕获子句里面什么都不写,就不能使用变量值除了显式指定想要捕获的变量,

C++还要求我们指定这些变量的传递方式,可以选择的传递方式有两种:按值传递和按引用传递。像[&odd_count] 这种写法是按引用传递,这种传递方式使得你可以在Lambda的函数体里对odd_count变量进行修改。

相对的,如果变量名字前面没有加上"&"就是按值传递,这些变量在Lambda的函数体里是只读的。

[cpp]  view plain  copy
 print ?
  1. []        //未定义变量.试图在Lambda内使用任何外部变量都是错误的.  
  2. [x, &y]   //x 按值捕获, y 按引用捕获.  
  3. [&]       //用到的任何外部变量都隐式按引用捕获  
  4. [=]       //用到的任何外部变量都隐式按值捕获  
  5. [&, x]    //x显式地按值捕获. 其它变量按引用捕获  
  6. [=, &z]   //z按引用捕获. 其它变量按值捕获  


还用上面的括号中的值是空的 代表函数的参数为空。

[](int x, int y) { return x + y; } // 隐式返回类型

同时在使用lanbas中可以传入一个参数相当于一个函数一样。

这样的lamda函数看起来是不是很高级呢??



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值