【已解决】按钮连续点击问题

有一个菜单按钮回调函数里有一些其他菜单按钮的动作,怎么控制上一次点击执行完了所有的动作,才能再点击该按钮?

在你的Actiondone回调里去设置 menu->setEnabled(bool value);

请版主看一下
void HelloWorld::btnCallback(Ref* pSender)
{
if (isShow)
{
menuItem->runAction(RotateTo::create(0.3f, -720));
menuItem1->runAction(HelloWorld::spawnIn(0.6f));
menuItem2->runAction(HelloWorld::spawnIn(0.65f));
menuItem3->runAction(HelloWorld::spawnIn(0.7f));
menuItem4->runAction(HelloWorld::spawnIn(0.75f));
menuItem5->runAction(HelloWorld::spawnIn(0.8f));
}
else
{
menuItem->runAction(RotateTo::create(0.3f, 720));
menuItem1->runAction(HelloWorld::spawnOut(Vec2(200, 400), 0.6f));
menuItem2->runAction(HelloWorld::spawnOut(Vec2(270, 370), 0.65f));
menuItem3->runAction(HelloWorld::spawnOut(Vec2(330, 330), 0.7f));
menuItem4->runAction(HelloWorld::spawnOut(Vec2(370, 270), 0.75f));
menuItem5->runAction(HelloWorld::spawnOut(Vec2(400, 200), 0.8f));
}

isShow = !isShow;

}

ActionInterval* HelloWorld::spawnIn(float duration)
{
ActionInterval* rotateTo = RotateTo::create(duration, -1080);
auto move_ease_in = EaseBackIn::create(MoveTo::create(duration, Vec2(200, 200)));
return Spawn::create(move_ease_in, rotateTo, nullptr);
}

ActionInterval* HelloWorld::spawnOut(Vec2 point, float duration)
{
//auto delay = DelayTime::create(1);
ActionInterval* rotateTo = RotateTo::create(duration, 1080);
auto move_ease_out = EaseBackOut::create(MoveTo::create(duration, point));
return Spawn::create(move_ease_out, rotateTo, nullptr);
}

void HelloWorld::btnCallback1(Ref* pSender)
{}
void HelloWorld::btnCallback2(Ref* pSender)
{}
void HelloWorld::btnCallback3(Ref* pSender)
{}
void HelloWorld::btnCallback4(Ref* pSender)
{}
void HelloWorld::btnCallback5(Ref* pSender)
{}

btnCallback这个回调是点击按钮的,里面有几个精灵的动作,按您说的不知道该在哪里设置menu->setEnabled(bool value);
我在最后一个runAction里外层又包了一个队列动作然后在回调里设置menu->setEnabled(bool value); 但不能绝对控制连续点击的问题。

我给你改了一下代码,代码如下:

#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    menuItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::btnCallback,this));
    menuItem1 = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::btnCallback1,this));
    menuItem2 = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::btnCallback2,this));
    menuItem3 = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::btnCallback3,this));
    menuItem4 = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::btnCallback4,this));
    menuItem5 = MenuItemImage::create("CloseNormal.png","CloseSelected.png");
    
    
    menu = Menu::create(menuItem,menuItem1,menuItem2,menuItem3,menuItem4,menuItem5,nullptr);
    menu->alignItemsVerticallyWithPadding(10);
    menu->setPosition(Point(100,170));
    
    this->addChild(menu);
    
    isShow = true;
    return true;
}

void HelloWorld::btnCallback(Ref* pSender)
{
    if (isShow)
    {
        menuItem->runAction(RotateTo::create(0.3f, -720));
        menuItem1->runAction(HelloWorld::spawnIn(0.6f));
        menuItem2->runAction(HelloWorld::spawnIn(0.65f));
        menuItem3->runAction(HelloWorld::spawnIn(0.7f));
        menuItem4->runAction(HelloWorld::spawnIn(0.75f));
        menuItem5->runAction(Sequence::create(HelloWorld::spawnIn(0.8f),CallFunc::create(CC_CALLBACK_0(HelloWorld::btnCallback5,this)) ,NULL));
    }
    else
    {
        menuItem->runAction(RotateTo::create(0.3f, 720));
        menuItem1->runAction(HelloWorld::spawnOut(Point(200, 400), 0.6f));
        menuItem2->runAction(HelloWorld::spawnOut(Point(270, 370), 0.65f));
        menuItem3->runAction(HelloWorld::spawnOut(Point(330, 330), 0.7f));
        menuItem4->runAction(HelloWorld::spawnOut(Point(370, 270), 0.75f));
        menuItem5->runAction(Sequence::create(HelloWorld::spawnOut(Point(400, 200), 0.8f),CallFunc::create(CC_CALLBACK_0(HelloWorld::btnCallback5,this)),NULL));
    }
    
    isShow = !isShow;
    
    menu->setEnabled(false);
}

ActionInterval* HelloWorld::spawnIn(float duration)
{
    ActionInterval* rotateTo = RotateTo::create(duration, -1080);
    auto move_ease_in = EaseBackIn::create(MoveTo::create(duration, Point(200, 200)));
    return Spawn::create(move_ease_in, rotateTo, nullptr);
}

ActionInterval* HelloWorld::spawnOut(Point point, float duration)
{
    //auto delay = DelayTime::create(1);
    ActionInterval* rotateTo = RotateTo::create(duration, 1080);
    auto move_ease_out = EaseBackOut::create(MoveTo::create(duration, point));
    return Spawn::create(move_ease_out, rotateTo, nullptr);
}

void HelloWorld::btnCallback1(Ref* pSender)
{}
void HelloWorld::btnCallback2(Ref* pSender)
{}
void HelloWorld::btnCallback3(Ref* pSender)
{}
void HelloWorld::btnCallback4(Ref* pSender)
{}
void HelloWorld::btnCallback5()
{
    menu->setEnabled(true);
}


```

代码和效果图已发。我点击那个按钮的时候是连续点击的。

这效果碉堡啊,有点像android的path。

我最初也是在最后一个action里回调来控制的,只是用的一个变量,然后在点击里做变量的判断,但不能绝对控制,快速点击也会出问题。
多谢版主了!

谢谢各位,已经解决了。