无法使用Lambda创建MenuItemImage

时间:2017-03-14 06:16:11

标签: lambda cocos2d-x

我尝试使用Lambda创建一个MenuItemImage来捕获触控回调: 这很好用:

MenuItemImage* mYouTube = MenuItemImage::create("en_block3.png", "en_block3_hover.png",
        // lambda function handle onClick event
        [=](cocos2d::Ref *pSender) -> bool {
        auto scale = ScaleBy::create(0.5f, 1.1f);
        mYouTube->runAction(scale);
        return true;

    });

但是当我在lambda 之外定义动作scale时,它没有按预期工作,Visual Studio编译没有任何问题但是应用程序崩溃了菜单项点击:

auto scale = ScaleBy::create(0.5f, 1.1f);
MenuItemImage* mYouTube = MenuItemImage::create("en_block3.png", "en_block3_hover.png",
        // lambda function handle onClick event
        [&](cocos2d::Ref *pSender) -> bool {
            mYouTube->runAction(scale);
            return true;
            });

知道导致此错误的原因吗?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

因为scale是局部变量,所以你必须将它传递给lambda函数,如下所示:

auto scale = ScaleBy::create(0.5f, 1.1f);
scale->retain();
MenuItemImage* mYouTube = MenuItemImage::create("en_block3.png", "en_block3_hover.png",
        // lambda function handle onClick event
        [&, scale](cocos2d::Ref *pSender) -> bool {
            mYouTube->runAction(scale);
            return true;
            });

此外,ScaleByRef类下降,因此它是自动释放类。由于您不会立即使用scale,因此会从内存中释放(0引用计数),并在点击mYouTube按钮后导致崩溃。

这就是你必须致电retain()的原因。但是当你不再需要它时(例如离开场景),你必须记得调用release()。在我看来,在lambda函数中创建这个缩放动画会更好。您还可以编写一个简单的函数,它将创建并返回scale