【问题标题】:How to fade a CCLayerColor and it's children to a given opacity? Cocos2d如何将 CCLayerColor 及其子项淡化为给定的不透明度? Cocos2d
【发布时间】:2012-11-22 16:30:50
【问题描述】:

我试图弄清楚如何将图层及其子级淡化为给定的不透明度。这就是我正在做的。

    - (id)init
    {

        if( (self=[super initWithColor:ccc4(0, 0, 255, 255)] )) {

            CCSprite *background = [CCSprite spriteWithFile:@"LevelsBackGround.png"];
            background.position = ccp([UIScreen mainScreen].bounds.size.height * .5f ,160);
            [self addChild:background];

            CCSprite *text = [CCSprite spriteWithFile:@"SwipeText.png"];
            text.position = ccp([UIScreen mainScreen].bounds.size.height *.5, 17);
            [self addChild:text];


            sceneText = [CCLabelTTF labelWithString:@"Yard" fontName:@"Baskerville-Bold" fontSize:20];
            sceneText.position = ccp([UIScreen mainScreen].bounds.size.height *.5, 300);
            sceneText.color = ccc3(172, 169, 164);
            [self addChild:sceneText];

        [self performSelector:@selector(LaunchLevel:) withObject:nil afterDelay:2.f];

}
    - (void ) LaunchLevel: (id) sender {

        [self runAction:[CCFadeTo actionWithDuration:.5 opacity:127]];
    }

但这似乎没有任何作用。如果我删除背景精灵以查看我设置图层的蓝色然后构建它,那么蓝色背景会完全褪色。所以我的问题是,为什么淡出所有的孩子层不起作用?

【问题讨论】:

    标签: cocos2d-iphone opacity cclayer


    【解决方案1】:

    从 Cocos2d-x v3-ish 开始(我使用的是 v3.4);如果您将多个Sprites 添加到Layer,您现在可以在图层上设置一个标志,以指示不透明度应该使用以下命令级联到其各自的子级:

    local layer = cc.Layer:create()
    layer:addChild(cc.Sprite("hero-dude.png"))
    layer:setCascadeOpacityEnabled(true)
    layer:runAction(cc.FadeTo:create(0.5, 127))
    

    【讨论】:

      【解决方案2】:

      递归设置孩子的不透明度并不能很好地渲染(“不透明度重叠”效果)。

      如果您想“作为一个整体”淡化整个节点层次结构,您可以使用CCRenderTexture(渲染您的节点图并将其淡化为单个图像)。

      如果您的孩子以某种方式被激活,您需要经常更新您的CCRenderTexture(相当消耗 CPU)。

      更多详情:http://2sa-studio.blogspot.com/2013/01/fading-node-hierarchy-with.html

      【讨论】:

      • 终于有了这个用处。 +1
      【解决方案3】:

      opacity 属性不会传播给子级。如果你愿意,你可以重写 setOpacity 方法:

      // in your .h file, an iVar 
      
      GLubyte _opacity;
      
      // in you .m, the overrides
      
      - (void)setOpacity:(GLubyte)opacity {
      
          for (id child in self.children) {
              id <CCRGBAProtocol> opaqueChild = (id <CCRGBAProtocol>) child;
              if ([opaqueChild respondsToSelector:@selector(setOpacity:)]) {
                  opaqueChild.opacity = opacity;
              } else {
                  // you must decide here what to do for your own situation
                  // and the children you are likely to have in there
              }
          }
          _opacity = opacity;
      }
      
      - (GLubyte)opacity {
          return _opacity;
      }
      

      edit : 扩展一个 CCLayerColor (这个编译,没有实际测试过,但应该可以工作)。只需将其添加到您的 .m 文件(您的类的实现)中:

      - (void)setOpacity:(GLubyte)opacity {
      
          for (id child in self.children) {
              id <CCRGBAProtocol> opaqueChild = (id <CCRGBAProtocol>) child;
              if ([opaqueChild respondsToSelector:@selector(setOpacity:)]) {
                  opaqueChild.opacity = opacity;
              } else {
                  // you must decide here what to do for your own situation
                  // and the children you are likely to have in there
              }
          }
          [super setOpacity:opacity];
      }
      

      【讨论】:

      • 我想我被误导了,我在 cocos2d 论坛上被告知,一个动作将应用于所有层子。
      • 我在看上面的cocos版本2,不透明度没有传播。我假设这是您自己的类之一,它以某种方式扩展了 CCNode。只需添加一个 iVar 并将代码添加到您的 .m 文件(类的实现)中。上面的代码是针对 CCNode 派生的。您的课程是否扩展了 CCColorLayer ?
      • 是的,我的类是 CCLayerColor 的子类。
      • 所以将这两个方法添加到您的 CCLayerColor 子类中。您不仅可以更改其子项的不透明度,还可以在其上使用不透明度操作(CCFadeIn、CCFadeOut、CCFadeTo)。只有一个改进 - 创建不透明的子数组并添加所有你想要对 setOpacity: 层的方法做出反应的东西。在这种情况下,您不仅可以淡化孩子,还可以淡化孩子的孩子。
      猜你喜欢
      • 2011-03-27
      • 2011-01-04
      • 2012-09-21
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多