cocos2dx中如何使用lamda表达式

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

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

	auto jump = JumpBy::create(jumpTime, Vec2(0, 0), tempJumpPos.y, 1);
	auto dely = DelayTime::create(jumpTime/2);
	auto seq = Sequence::create(dely, CallFunc::create(this, callfunc_selector(Player::jumpHalf)), NULL);
	auto spa = Spawn::create(jump, seq, NULL);
	spa->setTag(100);
	this->runAction(spa);


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

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


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

void FloatWord::floatOut(const float delay,std::function<void()> callback){
	Size visibleSize = Director::getInstance()->getVisibleSize();
	MoveTo* move = MoveTo::create(delay,Point(0,_begin.y));
	CallFunc* call = CallFunc::create(callback);
	int key = 10;

	CallFunc* removeC = CallFunc::create([this](){
		this->removeFromParentAndCleanup(true);
	});
	Sequence* action = Sequence::create(move,call,removeC,NULL);
	_label->runAction(action);
}

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

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

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

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

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


CallFunc* removeC = CallFunc::create([this,key](){

		auto i = key;
		this->removeFromParentAndCleanup(true);
	});

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

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

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

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

[]        //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y]   //x 按值捕获, y 按引用捕获.
[&]       //用到的任何外部变量都隐式按引用捕获
[=]       //用到的任何外部变量都隐式按值捕获
[&, x]    //x显式地按值捕获. 其它变量按引用捕获
[=, &z]   //z按引用捕获. 其它变量按值捕获


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

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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值