图层的过渡效果

时间:2012-07-19 04:44:42

标签: iphone ios cocos2d-iphone

在iPhone的cocos2d中,在一个场景中,我如何淡出一个图层并淡入另一个图层?

我的想法是我有一个屏幕:

  • 在顶部有一个分页控件(作为带有切换和选择器的菜单项完成)的一层
  • 屏幕的其余部分填充了另一个显示当前页面内容的图层。

现在,一旦用户点击任何分页控件,我想淡出当前页面的内容层(但保留分页图层),并淡入下一页的内容层。它们都是相同的层,它们基于currentPage变量从plist中提取数据,因此我需要刷新图层。

我知道,对于场景,在调用replaceScene时,您可以指定过渡效果。这样做就可以了。但显然,它也会淡化分页控件,这看起来很愚蠢。那么它对图层有什么作用呢?

3 个答案:

答案 0 :(得分:1)

hmmm ....使用CCLayerColor(它实现CCRGBAProtocol协议),淡入淡出将传播到其中的任何对象。然后做这样的事情:

-(void) buttonTouchedCallBack{
    id out = [CCFadeTo actionWithDuration:.35 opacity:0];
    id callFunc = [CCCallFunc actionWithTarget:self selector:@selector(changeContent)];
    id in = [CCFadeTo actionWithDuration:.35 opacity:255];
    id enableMenus = [CCCallFunc actionWithTarget:self selector:@selector(layerInView)];

    _menu.isTouchEnabled=NO;
    [_contentLayer stopAllActions];
    [_contentLayer runAction:[CCSequence actions:out,callFunc,in,enableMenus,nil]];
}

-(void) changeContent{
    // do your stuff here
}

-(void) layerInView{
    _menu.isTouchEnabled=YES;
    // and anything else that is appropriate
}

答案 1 :(得分:0)

我认为你可以使用runAction:让你的CCLayerCCAction(例如CCFadeInCCFadeOut),这样你就可以实现目标你想要的。

您需要两个内容层来分别保存当前页面(页面A)和下一页面页面(页面B)。在两个内容层的淡出操作结束后,您可以清理页面A.

答案 2 :(得分:0)

我写了一个小函数,它将使用块来提供与场景转换相同的淡入淡出效果,但对于单个图层。只需传入要隐藏的图层,淡出和淡入的速度,淡入淡出的颜色,以及隐藏图层时希望执行的块。

-(void)fadeLayer:(CCLayer*)layer withOutDuration:(float)outTime inDuration:(float)inTime color:(ccColor3B)color withBlock: (void(^)())block
{
    CGSize winSize = [[CCDirector sharedDirector] winSize];
    CCLayerColor *toplayer = [CCLayerColor layerWithColor:ccc4(color.r, color.g, color.b, 0) width:winSize.width height:winSize.height];

    [layer addChild:toplayer z:INT_MAX];

    [toplayer runAction:
      [CCSequence actions:
      [CCFadeIn actionWithDuration:outTime],
      [CCCallBlock actionWithBlock:block],
      [CCFadeOut actionWithDuration:inTime],
      [CCCallBlockN actionWithBlock:^(CCNode *node) {
         [node removeFromParentAndCleanup:YES];
      }],
  nil]];
}