0

私はCCLayerColorをフェードしたいと思っていますが、これはかなり簡単に思えますが、うまくいきません...これが私がすることです:

LoadingScreen.h

@interface LoadingScreen : CCLayerColor{

}

-(id)init;
-(void)setOpacity:(GLubyte)opacity;

@end

LoadingScreen.m

@implementation LoadingScreen

-(id)init{
    if ((self=[super initWithColor:ccc4(66 , 66, 66, 255)])){

        self.isTouchEnabled = NO;

    }
    return self;

}

-(void)setOpacity:(GLubyte)opacity{

    for( CCNode *node in [self children] )
    {
        if( [node conformsToProtocol:@protocol(CCRGBAProtocol)] )
        {
            NSLog(@"conforms to protocol!");
            [(id<CCRGBAProtocol>) node setOpacity: opacity];
        }
    }
}



@end

GameLayer.m

-(id)init{
timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(checkIfLoaded) userInfo:nil repeats:YES];
}


-(void)checkIfLoaded{
    NSLog(@"still doing stuff");
    if(doneInitializing ==YES){
        NSLog(@"done");
        [timer invalidate];
        NSLog(@"FADE NOW !!!!");
        id fade = [CCFadeOut actionWithDuration:2.5];
        [loadingLayer runAction:fade];
        [self performSelector:@selector(removeLoadingLayer) withObject:nil afterDelay:3.5];

    }

    if(loadingScreenPushed == NO && doneInitializing == NO){
        NSLog(@"adding Layer");
        loadingScreenPushed = YES;
        loadingLayer = [LoadingScreen node];
        [self addChild:loadingLayer z:10];

    }



}
4

3 に答える 3

1

私が覚えている限りでは、フェード アクションは、現在の不透明度の値に応じて、ティックごとに新しい不透明度を計算します。標準の CCLayerColor setOpacity メソッドを新しいものに置き換えます。追加してみる

[super setOpacity: opacity]; 

setOpacity: メソッドに。

于 2012-05-30T22:59:18.133 に答える
0

わかりました...いくつかのこと:

1: という名前の別のクラスを作成する理由LoadingScreen...少し冗長に思えますが、これが最善の方法です: 変数の型CCColorLayerを宣言し、GameLayerそれだけで初期化するだけです.. ..loadingScreen=[CCColorLayer layerWithColor...etc]最適化に適しているし、自動解放されます。

2回目:交換

id fade = [CCFadeOut actionWithDuration:2.5];
[loadingLayer runAction:fade];

で:([loadingLayer runAction:[CCFadeOut actionWithDuration:2.5]];それはより速いです)

3番目:これを試してください:

if(loadingScreenPushed == NO && doneInitializing == NO){
//stuff
}else if(doneInitializing ==YES){
//stuff
}

あなたがそこでやっていると思うのは、レイヤーが画面に追加されているかどうかを確認して削除することです...しかし、レイヤーを画面に表示することはできません..後で追加するため...そうです..それらを反転すると、すべてが機能するはずです。

于 2012-05-30T21:45:35.110 に答える