0

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

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

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

4

3 回答 3

4

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

local layer = cc.Layer:create()
layer:addChild(cc.Sprite("hero-dude.png"))
layer:setCascadeOpacityEnabled(true)
layer:runAction(cc.FadeTo:create(0.5, 127))
于 2015-02-27T00:31:57.103 回答
3

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

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

而且,如果您的孩子以某种方式动画,您需要CCRenderTexture经常更新您的(相当消耗 CPU)。

更多细节在这里:http: //2sa-studio.blogspot.com/2013/01/fading-node-hierarchy-with.html

于 2013-05-31T06:25:05.320 回答
2

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

编辑:扩展一个 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];
}
于 2012-12-04T22:55:28.047 回答