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の を追加する場合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;
}

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];
}
于 2012-12-04T22:55:28.047 に答える