褪色CCLayerColor不起作用

时间:2012-05-30 21:27:48

标签: objective-c ipad cocos2d-iphone fade cclayer

我想淡化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];

    }



}

3 个答案:

答案 0 :(得分:1)

据我记忆,淡入淡出动作根据当前的不透明度值计算每个刻度新的不透明度。您将标准CCLayerColor setOpacity方法替换为新方法。尝试添加

[super setOpacity: opacity]; 

到你的setOpacity:方法。

答案 1 :(得分:0)

好吧......好几件事:

1:为什么要创建一个名为LoadingScreen的不同的类...它看起来有点多余,最好的是:在CCColorLayer中声明一个变量类型GameLayer,这就是它和只需用.. loadingScreen=[CCColorLayer layerWithColor...etc]初始化它..它更适合优化,并且它是自动释放的。

第二名:替换

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

with:[loadingLayer runAction:[CCFadeOut actionWithDuration:2.5]];(它更快)

第三:试试这个:

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

我认为你在做的是检查屏幕上是否添加了图层并将其删除...但是你不能在屏幕上显示图层...因为你以后添加它...所以是的......反过来,一切都应该有效。

答案 2 :(得分:0)

出于这个原因,我进行了一些自己的研究,原因与the_critic首先提出该问题相同,至少可以说我得到的结果令人惊讶。我正在为iPad iOS 8.4进行构建: 1)似乎在CALayer的子类的子类上的'super setOpacity'不起作用! (我从可以想象的各个方向进行了攻击)。 2)当setOpacity调用失败时,获取CALayer子类的子类的不透明度值会返回正确的值。

即:

@interface IntermediateLayerType : CALayer.....
@interface FinalLayerType : IntermediateLayerType....

使用FinalLayerType的某些方法...

[self setOpacity:1.0f];
[super setOpacity:0.0f];
NSLog(@"The opacity set was: %f", [self opacity]);

给出答案:“不透明度设置为:1.0” 我认为您遇到了同样的错误! 我的解决方法如下:

使用相同的“某种方法”。...

CALayer *myBaseInstance = (CALayer *)self;

[myBaseInstance setOpacity:0.0f];

这花了我一天半的开发时间,为我工作。 希望这对其他iPad开发人员有所帮助。 VV。