2010-07-30 7 views
1

J'ai un écran de chargement que j'initialise avec une étiquette pour afficher la progression du chargement. Je souhaite appeler mon DataManager APRES l'initialisation de l'écran de chargement, puis appeler une méthode pour changer de scène. Voici mon code:Exécuter une méthode après init dans cocos2d

-(id) init { 
    if((self=[super init])) 
    { 
    loadingLabel = .... 
    [self addChild:loadingLabel]; 

    /***** This is what I want to call after the init method 
    //DataManager loads everything needed for the level, and has a reference to the 
    //loading screen so it can update the label 
    [[DataManager sharedDataManager] loadLevel:@"level1" screen:self]; 
    //this will switch the scene 
    [self finishLoading]; 
    *****/ 
    } 
    return self; 
} 
-(void) setLoadingPercentage:(int) perc { 
    //changes the label 
} 
-(void) finishLoading { 
    [[CCDirector sharedDirector] replaceScene:[Game node]]; 
} 

donc je ne peux pas appeler le gestionnaire de données dans le init, parce que l'étiquette ne sera pas mis à jour le contenu est chargé, et je ne peux pas changer de scène dans la méthode init. Alors, comment puis-je exécuter mon datamanger et terminer le chargement après l'init? Mon plan était de définir un horaire à un intervalle de 1 seconde qui fait cela, mais il ne semble pas juste d'avoir à attendre une seconde.

EDIT: une autre façon de le faire est de planifier à chaque trame et de demander au datamanager où il se trouve ... Cela semble déjà mieux, car le datamanager n'aurait pas besoin d'une référence à l'écran de chargement.

Des idées?

Répondre

3

Vous pouvez utiliser performSelector:withObject:afterDelay: pour forcer l'exécution du sélecteur spécifié lors de la prochaine itération des fils de courant exécuté boucle:

[self performSelector:@selector(finishLoading) withObject:nil afterDelay:0.0f]; 
0

La réponse ci-dessus est correcte, mais vous devez utiliser la façon de planifier les méthodes Cocos2d pour courir plus tard:

[self schedule:@selector(finishLoading) interval:0.1]; 

-(void)finishLoading 
{ 
    [self unschedule:@selector(finishLoading)]; 
    //Do your stuff 
} 
Questions connexes