在cocos2d-x项目中,连续多次前后台切换,会出现动画特效不恢复播放的情况,看了看cocos2d-x的ActionManager,现记录如下:
Vector<Node*> ActionManager::pauseAllRunningActions()
{
Vector<Node*> idsWithActions;
for (tHashElement *element=_targets; element != nullptr; element = (tHashElement *)element->hh.next)
{
if (! element->paused)
{
element->paused = true;
idsWithActions.pushBack(element->target);
}
}
return idsWithActions;
}
第一次游戏进入后台时,会执行上面的pauseAllRunningActions方法,该方法保存了正在运行的动画节点,当游戏切换到前台时,会恢复所有动画的执行:
//恢复动画
if(idsWithActions.size() > 0){
Director::getInstance()->getActionManager()->resumeTargets(idsWithActions);
idsWithActions.clear();
}
当再次切换游戏到后台时,由于之前的动画节点已经是暂停状态,所以执行pauseAllRunningActions方法时不会添加到idsWithActions容器中,此时idsWithActions数量为0
此时再切换回前台时,由于idsWithActions.size()为0,所以不会执行恢复动画的动作,故动画不会恢复
后来将pauseAllRunningActions方法改成如下:
Vector<Node*> ActionManager::pauseAllRunningActions()
{
Vector<Node*> idsWithActions;
for (tHashElement *element=_targets; element != nullptr; element = (tHashElement *)element->hh.next)
{
if (! element->paused)
{
element->paused = true;
idsWithActions.pushBack(element->target);
}else
{
idsWithActions.pushBack(element->target);
}
}
return idsWithActions;
}
问题解决
可能ActionManager的设计就是如此,反正问题解决了,先不管它如何设计了