2012-05-30 8 views
0

Я хотел бы исчезать CCLayerColor, который, кажется, довольно просто, но это просто не работает ... Вот что я делаю:выцветания 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. м

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

    } 



} 

ответ

1

Насколько я помню, затухающие действия вычисляют на каждой отметке новую непрозрачность в соответствии с текущим значением непрозрачности. Вы заменяете стандартный метод CCLayerColor setOpacity новым. Попробуйте добавить

[super setOpacity: opacity]; 

к вашему наборуOpacity: method.

+0

Отлично! Вот так! Большое спасибо :-) –

+0

добро пожаловать =) – Morion

0

ок ... несколько вещей:

1: почему делают другой класс называется LoadingScreen ... это кажется немного излишним, что это лучше всего это: объявить переменную типа CCColorLayer в GameLayer и все, и просто инициализируйте его с помощью .. 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 
} 

Что я думаю, что вы делаете там проверки, если слой добавлен на экран и удаляет его ... но у вас не может быть слоя на экране ... потому что вы добавляете его гораздо позже ... так что давайте ... все это и должно работать.

+0

1.) Потому что мне нужно подклассифицировать CCLayer, чтобы добавить метод '-setOpacity'. 2.) Это не является частью проблемы, и 3.) метод вызывается таймером каждые сплит-секунду до тех пор, пока GameLayer не будет выполнен, и добавленный слой не будет удален ... –

+0

1) вы не ... у каждого узла есть свойство непрозрачности, 2) небольшая оптимизация никому не повредит, 3) просто попробуйте и скажите, как это работает – skytz

+0

1) Поверьте мне, я должен ... У меня возникли проблемы перед потому что CCLayers обычно не поддерживают метод '-setOpacity'. 2) Я думаю, что такая оптимизация может быть опущена (не грубая, но я думаю, что это вопрос смешных задержек, на которые нужно обратить внимание) и 3) Почему? Код работает отлично, как я хочу, это просто Слой, который не хочет исчезать. Журналы в консоли подтверждают мое ожидание поведения приложения. –