cocos2dx中的lambda表达式很好用,可用于回调操作,类似Objective C中的block.
1. 在Action中
auto mt = MoveTo::create(1, Vec2( 100, 100) );
auto cf = CallFunc::create( [](){
CCLOG(" lambda test ");
});
auto seq = Sequence::createWithTwoActions( mt, cf);
sprite->runAction( seq );
运行过程为: 移动完成后,打印"lambda test".
2. 在Button中
auto b = Button::create();
b->addTouchEventListener( [](Ref *pSender, Widget::TouchEventType type){
if (type == Widget::TouchEventType::ENDED) {
CCLOG(" lambda test ");
}
});
运行过程为: 点击按钮,且在按钮范围内放开手指,打印"lambda test".
注:
(1) this表示在表达式内可以调用this的属性和函数, 若要调用表达式之外的某个值变量,可以用[this, count](),若不是值变量,可用[this, ¶m],当然,this可省略.lambda 的[ ]具体用法可自行百度.
(2) 这里的表达式参数列表必须与上面一直,当然,形参名可以不同.
(3) 表达式中最好判断一下时间类型,不然你可能会发现表达式被调用了多次.
3. 在MenuItem中
auto ml = MenuItemLabel::create( Label::create() , [](Ref *pSender){
CCLOG(" lambda test ");
});
运行过程为: 点击Label,打印"lambda test".
注:
(1) 这里不用判断时间类型,默认一次点击响应一次.
(2) lambda 表达式的需要的参数列表,可参考源码,举例如下:
auto m2 = MenuItemLabel::create(cocos2d::Node *label, const ccMenuCallback &callback);
查看后面callback的定义可见:
typedef std::function<void(Ref*)> ccMenuCallback;
意思是说,需要一个类型为Ref *的参数.
4. 在schedule中
在默认的schedul函数中,似乎没有lambda版本(本人暂时未发现),这里用另外的方式实现:
getScheduler()->schedule([](float dt){
CCLOG("lambda test");
}, this, 0.5, false, "schedule lambda");
运行过程为: 每0.5s打印一次"lambda test".
注:这里的schedule有两个版本,可自行按照需求使用.