[cocos2d-iphone]replaceScene执行CCTransitionScene的一些分析

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无法结束。

猜你喜欢

转载自poolo.iteye.com/blog/1855198