Cocos2d iphone 如何将CCLayerColor及其子对象褪色为给定的不透明度?Cocos2d

Cocos2d iphone 如何将CCLayerColor及其子对象褪色为给定的不透明度?Cocos2d,cocos2d-iphone,opacity,cclayer,Cocos2d Iphone,Opacity,Cclayer,我试图找出如何将层及其子层淡入给定的不透明度。这就是我正在做的 - (id)init { if( (self=[super initWithColor:ccc4(0, 0, 255, 255)] )) { CCSprite *background = [CCSprite spriteWithFile:@"LevelsBackGround.png"]; background.position = ccp([UISc

我试图找出如何将层及其子层淡入给定的不透明度。这就是我正在做的

    - (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]];
    }

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

不透明度属性不会传播到子层。如果需要,可以覆盖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;
}
编辑:扩展此编译的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];
}

递归设置子对象的不透明度不会很好地渲染不透明度重叠效果

如果要整体淡入整个节点层次,可以使用CCRenderTexture渲染节点图并将其淡入单个图像

而且,如果您的孩子以某种方式充满活力,那么您需要经常更新您的CCRenderTexture,这需要相当高的CPU成本


这里有更多详细信息:

从Cocos2d-xv3开始,我使用的是v3.4;如果要向层添加多个精灵,现在可以在层上设置一个标志,指示不透明度应通过以下命令级联到其各自的子级:

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

我猜我是被误导了,我在cocos2d论坛上被告知一个动作将应用于所有的层子。我正在看上面的cocos版本2,不透明性没有传播。我假设这是您自己的类之一,它以某种方式扩展了CCNode。只需添加一个iVar并将代码添加到.m文件中,以实现该类。上面的代码是针对CCNode派生的。你的类扩展了CCColorLayer吗?是的,我的类是CCLayerColor的一个子类。所以把这两个方法添加到你的CCLayerColor子类中。您不仅可以更改其子项的不透明度,还可以在其上使用不透明度操作CCFadeIn、CCFadeOut、CCFadeTo。只有一个改进-创建不透明子对象的数组,并添加您想要对图层的setOpacity:method做出反应的所有内容。在这种情况下,您不仅可以使儿童褪色,还可以使儿童的儿童褪色。最终,您可以使用此功能+1.