replaceScene:之后 可以传入 CCTransitionScene的子类。
假设有3个scene
AScene BScene CScene;
如果A replace 到B 。然后带有一个10秒的动画效果。
那么 在这10秒内 B如果replaceC的话会出现ABC同屏。(也不要尝试onEnterTransitionDidFinish 这个方法被条用时 runSecne还不是B)。
原因如下:
CCTransitionScene 的机制是 自己更具当前 软件sence运行栈的顶端元素(top)和将要替换的元素(next)组成一组包含top和next的 scene并且执行动画。动画执行完后再replace到next。
那么在A->B还没有运行完的时候,此时的runSecne是A->B对应的CCTransitionScene对象。那么在组成我们想要的B->C的时候的CCTransitionScene对象 就变成<A->B对应的CCTransitionScene对象,C>。此时B->C的CCTransitionScene对象replaceC A->B对应的CCTransitionScene对象。无法执行。
因为在下面代码黄色处。CCTransitionScene对象对象无法获取到。从而无法执行action 无法触发CCCallFunc。无法执行finish(CCTransitionScene 的finish代码段有 将当前CCTransitionScene replace到目标secne的方法,所以无法执行finish会卡在CCTransitionScene一直刷新A B C)。
@implementation CCTransitionFade
-(void) onEnter
{
[super onEnter];
CCLayerColor *l = [CCLayerColor layerWithColor:color];
[_inScene setVisible: NO];
[self addChild: l z:2 tag:kSceneFade];
CCNode *f = [self getChildByTag:kSceneFade];
CCActionInterval *a = [CCSequence actions:
[CCFadeIn actionWithDuration:_duration/2],
[CCCallFunc actionWithTarget:self selector:@selector(hideOutShowIn)],
[CCFadeOut actionWithDuration:_duration/2],
[CCCallFunc actionWithTarget:self selector:@selector(finish)],
nil ];
[f runAction: a];
}
结论:
1.不要在两个连续的短时间内,使用CCTransitionScene效果多次。会导致跳转失败。
2.replaceScene 不能存在于 init onEnter onEnterXXXX 方法中立刻执行,要么崩溃,要么抽风(其实- -现实不存在以上中立刻执行的需求)。
3. CCTransitionScene动画效果还没结束时,无法replaceScene任何内容。
4. 当:replaceScene CCTransitionScen时如果RuningScene也是一个CCTransitionScen则会导致CCTransitionScen无法结束。