实现一个精灵的两个动作互斥
实现背景:
当前一个精灵有两个动作,一个动作X,一个动作Y,要求其中一个动作播放动画时候,再次点击当前按钮或者点击另一个动作按钮无效
解决方案:
现X、Y动作互斥,设置一个判定变量acting,当其为false的时候,X、Y动作都可以执行,当某个动作正在进行中,acting将被设为true,表示正在执行X或Y动作,此时点击按钮X、Y无效,必须等待当前动画结束后acting被设置为false以后,二者才重新生效。
实现代码:
在相对应的类中添加一个新的成员
acting
bool acting;
acting在初始化函数时初始值为
false
按钮X回调函数
void HelloWorld::Xfun(cocos2d::Ref * pSpender) { if (!acting) { //使得其他动作回调函数不能进入播放动画 acting = true; //X动作时候的动画 Animate* deadAnimate = Animate::create(AnimationCache::getInstance()->getAnimation("deadAnimation")); auto set = CallFunc::create(([this]() { log("x"); acting = false; })); //当播放完动画以后才设置acting的值 Sequence* deadSeq = Sequence::create(deadAnimate, set, NULL); player->runAction(deadSeq); } }
按钮Y回调函数
void HelloWorld::Yfun(cocos2d::Ref * pSpender) { if (!acting) { //使得其他动作回调函数不能进入播放动画 acting = true; //Y动作时候的动画 Animate* attackAnimate = Animate::create(AnimationCache::getInstance()->getAnimation("attackAnimation")); auto set = CallFunc::create(([this]() { log("y"); acting = false; })); //当播放完动画以后才设置acting的值 Sequence* attackSeq = Sequence::create(attackAnimate, set, NULL); player->runAction(attackSeq); } }