2016-03-16 29 views
1

我正在制作滑块拼图,此功能应移动拼贴,然后返回到主要功能以便继续播放,我也可以使用此功能来随机播放在游戏开始的时候,当我称之为所有的瓷砖移动到其他地方并进入错误的地点或离开屏幕时,这是因为不是运行moveTo,而是需要0.2秒,然后在0.2秒后返回,它开始动作并立即返回,所以当再次被调用时,瓷砖仍在移动,将所有东西都搞乱。Cocos2d-x C++ - 在继续之前等待动作完成之前

有没有什么办法阻止代码在动作完成之前继续?感谢;)

bool GameScene::updateTile(Sprite* tile, int newPos) 
{ 
    auto moveTo = MoveTo::create(0.2, Vec2(widthArray[newPos], heightArray[newPos])); 
    auto whatever = CallFunc::create([]() { 
     CCLOG("hi"); 
    }); 
    auto seq = Sequence::create(moveTo, whatever, nullptr); 
    tile->runAction(seq); 
    CCLOG("running"); 
    return true; 
} 

//编辑

此代码打印: “跑” 和之后0.2秒(时间需要运行动作的moveTo) “HI”(从动作无论)

我的目标是为它等待0.2秒,然后打印“喜”和,只有在此之后,打印“跑”,但如果我尝试使用任何类型的延迟或环 喜欢的停止代码:

bool GameScene::updateTile(Sprite* tile, int newPos) 
    { 
     auto moveTo = MoveTo::create(0.2, Vec2(widthArray[newPos], heightArray[newPos])); 
     auto whatever = CallFunc::create([]() { 
      CCLOG("hi"); 
     }); 
     auto seq = Sequence::create(moveTo, whatever, nullptr); 
     tile->runAction(seq); 
     while (tile->getNumberOfRunningActions != 0) 
       { //delay 
       } 
     CCLOG("running"); 
     return true; 
    } 

它不运行任何操作,只是卡住了,有什么想法?

+0

的Cocos2D-X是单线程。 while循环将使其陷入困境。使用预定的函数而不是while循环。看我的edit2。 – Zen

回答

3

您可以使用tag检查动作是否已完成:

bool GameScene::updateTile(Sprite* tile, int newPos) 
{ 
    static const int MY_MOVE_SEQ = 3333; 
    if (tile->getActionByTag(MY_MOVE_SEQ) && !tile->getActionByTag(MY_MOVE_SEQ)->isDone()) { 
     return; 
     //or you can stop the last action sequence and then run new action 
     //tile->stopActionByTag(MY_MOVE_SEQ); 
    } 

    auto moveTo = MoveTo::create(0.2, Vec2(widthArray[newPos], heightArray[newPos])); 
    auto whatever = CallFunc::create([]() { 
     CCLOG("hi"); 
    }); 
    auto seq = Sequence::create(moveTo, whatever, nullptr); 
    //set tag here! 
    seq->setTag(MY_MOVE_SEQ); 

    tile->runAction(seq); 
    CCLOG("running"); 
    return true; 
} 

//编辑

bool anyActionRunning = false; 
    tile->getParent()->enumerateChildren("//Tile", [&anyActionRunning](Node* child) { 
     if (child->getActionByTag(MY_MOVE_SEQ) && !child->getActionByTag(MY_MOVE_SEQ)->isDone()) { 
      anyActionRunning = true; 
      return true; 
     } 
     return false; 
    }); 

// EDIT2:

static const string funcName = "CheckAction"; 
tile->schedule([tile](float dt) { 
    if (tile->getNumberOfRunningActions == 0) { 
     CCLOG("running"); 
     tile->unschedule(funcName); 
    } 
}, funcName); 
+0

嗨,用这个我可以阻止当前磁贴执行另一个动作,而且他们不会再离开屏幕,但是我想要做的是在执行CCLOG之前先完成所有动作的序列后再等待( “运行”);并继续在代码 – Gualtiero

+0

不真的明白你的问题。但我想你可以使用'enumerateChildren'和定时器做@ Gualtiero – Zen

+0

好吧,我编辑的问题,以使其更清晰,问题是,这个代码打印: 运行 和后0.2秒(时间需要运行行动的moveTo) 喜(从动作等等) 我的目标是为它等待0.2秒,然后打印喜,只有在此之后,打印运行,但如果我尝试停止使用任何类型的延迟或循环它不代码运行任何行动,只是卡住了,有什么想法? – Gualtiero

相关问题