关于repalceScene引起的动画暂停的问题,附测试代码

现象描述:
1 在scene1搞一个动画
2 用replaceScene方法从scene1切换到scene2,
3 用replaceScene方法从scene2切换到scene1,
问题:动画被暂停了

补充:如果用 pushScene则没有上述问题

Classes.rar (3 KB)
测试代码如上,请在资源里搞一张图“common_gray_button.png”,会用到

调用测试代码的方法两行:
CCScene *pScene = TestScene1::create();
pDirector->runWithScene(pScene);

操作:
1 点击step 1 btn,制造一个动画效果
2 点击step 2 btn, replaceScene进来
3 在新scene里点击btn, replace回原来的Scene,可以看到动画已经暂停

推测:replaceScene里做了一些特殊的操作,把action给remove掉了,而不是像pushScene那样只是pauseAction

请开发组看看吧,需要怎么修改才能避免这个问题
谢谢

之前发了一个帖子http://www.cocoachina.com/bbs/read.php?tid=195188
这个地方描述不是很清楚。这次专门附上了代码以便测试

当 replaceScene的时候,在这个函数里
void CCActionManager::removeAllActionsFromTarget(CCObject *pTarget)
下了一个断点,然后拦截到以下的调用栈
在这个函数里Label的action被remove掉了,因此切回来之后就无法继续动画了。
但是不知道不知道怎么修改正确

话说scene1 还有用,只是暂时切走了,等下还要显示,何必要cleanup呢
要cleanup也是析构的时候做吧

cocos2dx的逻辑设计 对于replaceScene 会视为没有用的scene,直接清除掉。
我以前有遇到这个问题,想保留scene,推出后 下次还能再复用。
结果有各种问题,所以不得不换了个方法,推出时记录这个scene的动作状态,下次进来的时候再复原这些动作。
或者用pushScene

楼主您好,replaceScene就是本意就是替换创建,你这里虽然建了一个单例(我真没看懂你的单例···)但是应该还是部分被清楚了才对。如果你需要保留这个场景就要使用push,push将会把这个场景存进栈里~~所以你应该使用pushScene方法。

— Begin quote from ____

引用第3楼hanrea于2014-03-28 09:58发表的 回 1楼(flysec) 的帖子 :
楼主您好,replaceScene就是本意就是替换创建,你这里虽然建了一个单例(我真没看懂你的单例···)但是应该还是部分被清楚了才对。如果你需要保留这个场景就要使用push,push将会把这个场景存进栈里~~所以你应该使用pushScene方法。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=195926&pid=913333

— End quote

应用场景是这样的:
类似于IOS的底部TAB,有5个TAB
每个TAB一个scene,依次是scene1, scene2,scene3…
当打开scene1,然后打开scene2,再打开scene3,如果用pushScene,请问如何切换回scene1,是连续pop两次么。这明显是不合理的

这种场景用5个scene单件来实现是非常合理的

— Begin quote from ____

引用第2楼borisyue于2014-03-28 09:41发表的 :
cocos2dx的逻辑设计 对于replaceScene 会视为没有用的scene,直接清除掉。
我以前有遇到这个问题,想保留scene,推出后 下次还能再复用。
结果有各种问题,所以不得不换了个方法,推出时记录这个scene的动作状态,下次进来的时候再复原这些动作。
或者用pushScene http://www.cocoachina.com/bbs/job.php?action=topost&tid=195926&pid=913293

— End quote

我也是这么干的,但是越来越多的动画让所有代码都变得混乱不堪了,实在是不能忍

那你就不对了~~一个游戏里是不会同时显示多个场景的,所以你这个就不同于ios的UIToolBar(底部那个)。虽然你要的效果是那样,但场景更类似于ios的 UINavigationController。如果您是ios转cocos请注意这个区别。

— Begin quote from ____

引用第6楼hanrea于2014-03-28 11:52发表的 回 4楼(flysec) 的帖子 :
那你就不对了~~一个游戏里是不会同时显示多个场景的,所以你这个就不同于ios的UIToolBar(底部那个)。虽然你要的效果是那样,但场景更类似于ios的 UINavigationController。如果您是ios转cocos请注意这个区别。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=195926&pid=913510

— End quote

版主我做的卡牌游戏,类似于MT, MT的底部也有5,6个TAB
我是用cocos2d-x实现类似MT online ,也像ios 底部那种tab的效果,每个 tab由一个场景实现,所以是属于cocos2d-x的问题

另外replaceScene既然没有析构之前的scene,为何要removeAction
从代码上看明显是issue709的补丁造成的,并没有从根本上解决之前的问题,而是测试不严谨引发了另外一个BUG

重写了测试代码里的单件,调用代码为:
CCScene *pScene = TestScene1::getInstance();
pDirector->runWithScene(pScene);

你几个场景都是单例不释放的??

— Begin quote from ____

引用第9楼hanrea于2014-03-28 14:22发表的 回 8楼(flysec) 的帖子 :
你几个场景都是单例不释放的?? http://www.cocoachina.com/bbs/job.php?action=topost&tid=195926&pid=913678

— End quote

是的,底部的tab都各自对应一个场景单件,不释放,现在的UI加载速度比较卡的说,释放了下次再次载入会卡。。体验很差的,所以就单件了

唉,放弃了,彻底改造了UI框架,底部5个tab用UILayer实现了
还有很多代码要改。。。