0

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

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

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

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

我知道对于场景,调用时replaceScene可以指定过渡效果。并以这种方式进行所有工作。但显然,它也会淡出分页控件,这看起来很愚蠢。那么它是如何对图层起作用的呢?

4

3 回答 3

1

嗯 .... 使用 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
}
于 2012-07-19T13:24:11.657 回答
0

我认为你可以使用runAction:let your CCLayers do CCActions (例如CCFadeInand CCFadeOut),这样你就可以实现你想要的。

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

于 2012-07-19T05:36:01.487 回答
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]];
}
于 2013-04-16T17:06:41.117 回答