我正在制作一个滑块拼图,此功能应该移动一个拼贴然后返回主要功能,以便我可以继续玩,我也使用此功能在游戏开始时洗牌,但是当我把这个叫做所有的瓷砖移动到另一个并进入错误的位置或离开屏幕,这是因为代替运行动作moveTo需要0.2秒然后,在0.2秒后返回,它开始动作并直接返回所以当这再次被调用,瓷砖仍然在移动一切。
有没有办法在动作完成之前停止代码继续?谢谢;)
onclick="playPasue()
//修改
此代码打印: “跑” 0.2秒后(运行动作所需的时间) “嗨”(来自行动无论如何)
我的目标是让它等待0.2秒然后打印“hi”,然后,打印“运行”,但如果我尝试使用任何类型的延迟或循环停止代码 像:
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 :(得分: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);