cocos2dx中lambda表达式几种用法的初步总结

本文深入探讨了Cocos2dx中lambda表达式的使用方法,通过实例展示了其在Action、Button、MenuItem及schedule中的应用。重点介绍了lambda表达式的特性、参数列表、时间类型判断以及与其他回调机制的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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, &param],当然,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有两个版本,可自行按照需求使用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拂面清风三点水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值