0

我想淡化一个 CCLayerColor,这似乎很简单,但它只是不起作用......这是我所做的:

加载屏幕.h

@interface LoadingScreen : CCLayerColor{

}

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

@end

加载屏幕.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

游戏层.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......它似乎有点多余,最好的是:声明一个变量类型CCColorLayerGameLayer就是这样,然后用......初始化它......它loadingScreen=[CCColorLayer layerWithColor...etc]更适合优化,它是自动释放的。

第二:更换

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

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

第三:试试这个:

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

我认为您正在做的是检查是否在屏幕上添加了图层并将其删除...但是您不能在屏幕上添加图层..因为您稍后会添加它...所以是的..颠倒这些,一切都应该工作。

于 2012-05-30T21:45:35.110 回答
0

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

IE:

@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 开发人员。维维。

于 2018-09-20T15:50:56.910 回答