2012-02-22 59 views
2

我在我的应用程序上使用了cocos2d。我做一个过渡使用Cocos2D iPhone - 删除CCTransition之间的黑屏

[[CCDirector sharedDirector] replaceScene: 
[CCTransitionFadeDown transitionWithDuration:0.5f scene:otherScene]]; 

在此场景等的初始化部分另一个场景,菜单正在修建,使用CCMenu。这是一个全屏菜单。

我的问题是:过渡发生在黑屏,然后菜单出现。换句话说,转换是在菜单被渲染之前完成的,所以,我看到一个丑陋的黑屏0.5秒,然后,在转换完成后,我看到菜单。

为了清楚起见,想象一下第一个场景有一张船的照片,第二个场景是一张汽车的照片。我现在拥有的是过渡到黑色的小船,然后汽车就会爆炸。我需要船过渡到汽车。

我该怎么做?谢谢。

注意:我发现this guy with the same problem,但我已尝试解决方案没有成功。

回答

1

我已经在我的菜单(同样的问题)来实现的转变,称它为“fadeInView”通过在init一切的顶部上添加的黑色层,具有255的不透明度,并且在的OnEnter予运行操作到不透明度淡出为0如下:

-(id) init { 
    self=[super init]; 
    if(self){ 
     // do your stuff 
     blackShroudLayer_=[CCLayerColor layerWithColor:ccc4(0, 0, 0, 255) width:K_SCREEN_WIDTH height:K_SCREEN_HEIGHT]; 
     [self addChild:blackShroudLayer_ z:500]; 
    } 
    return self; 
} 

-(void) onEnter{ 

    // need to [super onEnter] first to that we are running 

    [super onEnter]; 
    id sh = [CCFadeTo actionWithDuration:K_FADE_TIME opacity:0]; 
    id seq = [CCSequence actions:sh,[CCCallFunc actionWithTarget:self selector:@selector(onUnshroudComplete)], nil]; 
    [blackShroudLayer_ runAction:seq]; 
} 

-(void) onUnshroudComplete{ 
    [blackShroudLayer_ removeFromParentAndCleanup:YES]; 
} 

常量和blackShroudLayer_在类.h文件中定义。

+0

我真的不明白你在这里做什么,但任何方式,这对我来说是崩溃(我认为它在CCCallFunc部分崩溃)。两个问题:(1)你如何从其他场景调用这个? (我正在使用一个简单的replaceScene)...(2)有没有办法使用CCTransitionFadeDown而不是CCFade? (抱歉,但我是Cocos2D的新手)。谢谢 – SpaceDog 2012-02-26 10:19:58

+0

拼写callfunc中的选择器(修复代码片段)。这将是CCTransitionFade的淡入淡出(淡化当前,然后淡入下一个场景)。 – YvesLeBorg 2012-02-26 11:15:40

+0

@DigitalRobot:我对自己的cocos2d场景和转换经验不多。游戏的设计师构思了各种“离墙”场景转换,我们无法使用预先装好的cocos2d转换。所以这个代码实际上是在init中设置的,当一个对象作为一个子对象添加到另一个cocos2d对象时,'addEnter'会在addChild进程中被CCNode自动调用。你可以去这里找一个几乎所有可可粉的完整例子:http://www.pawapps.com/2011/07/30/tutorial-transitions-in-cocos2d/ – YvesLeBorg 2012-02-26 11:30:08

2

这是值得一试的,如果你还没有使用它;它消除场景负载时的黑色闪烁。运行下面的方法,你切换场景前,在情况下,它会影响您的问题(取消注释这些行,并直接调用方法):

- (void) removeStartupFlicker 
{ 
    // 
    // THIS CODE REMOVES THE STARTUP FLICKER 
    // 
    // Uncomment the following code if you Application only supports landscape mode 
    // 

    // CC_ENABLE_DEFAULT_GL_STATES(); 
    // CCDirector *director = [CCDirector sharedDirector]; 
    // CGSize size = [director winSize]; 
    // CCSprite *sprite = [CCSprite spriteWithFile:@"Default.png"]; 
    // sprite.position = ccp(size.width/2, size.height/2); 
    // sprite.rotation = -90; 
    // [sprite visit]; 
    // [[director openGLView] swapBuffers]; 
    // CC_ENABLE_DEFAULT_GL_STATES(); 

} 
+0

谢谢。我这样做,但问题仍然存在。 – SpaceDog 2012-02-22 07:26:28