2010-10-27 7 views
0

ce code crée une transition aléatoire lorsque je change de scène. Il y a onze transitions. Parce qu'ils sont statiques, je ne peux pas utiliser NSClassFromString. J'ai aussi besoin de passer l'objet scène (s). À l'heure actuelle, le commutateur semble redondant. Existe-t-il un moyen de réécrire cela pour le rendre plus efficace?Y at-il un meilleur moyen d'écrire ce code objectif-c?

-(void) newScene 
{ 
CCScene *s = [CCScene node]; 
id child = [sceneCharacter node]; 
[s addChild:child]; 
int random = arc4random() % 10; 


switch (random) 
{ 
    case 1: 
     [[CCDirector sharedDirector] replaceScene:[CCFadeTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 2: 
     [[CCDirector sharedDirector] replaceScene:[CCFadeTRTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 3: 
     [[CCDirector sharedDirector] replaceScene:[CCJumpZoomTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 4: 
     [[CCDirector sharedDirector] replaceScene:[CCMoveInLTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 5: 
     [[CCDirector sharedDirector] replaceScene:[CCOrientedTransitionScene transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 6: 
     [[CCDirector sharedDirector] replaceScene:[CCPageTurnTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 7: 
     [[CCDirector sharedDirector] replaceScene:[CCRotoZoomTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 8: 
     [[CCDirector sharedDirector] replaceScene:[CCShrinkGrowTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 9: 
     [[CCDirector sharedDirector] replaceScene:[CCSlideInLTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 10: 
     [[CCDirector sharedDirector] replaceScene:[CCSplitColsTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    case 0: 
     [[CCDirector sharedDirector] replaceScene:[CCTurnOffTilesTransition transitionWithDuration:0.5f scene:s]]; 
     break; 

    default: 
     [[CCDirector sharedDirector] replaceScene:s]; 
} 

}

Répondre

1

Que diriez-vous seulement d'assigner la variable s et de faire l'appel entier après l'instruction switch puisque votre seul problème est la redondance? Comme:

case 1:; 
    s = [CCFadeTransition transitionWithDuration:0.5f scene:s]]; 
    break; 

Et puis appelez replaceScene après l'instruction switch:

[[CCDirector sharedDirector] replaceScene:s]; 

à mon humble avis, c'est plus propre.

+0

La réponse de xscott est plus correct puisque je ne remarquèrent pas que vous êtes des choses :) -_- randomiser – LaN

6

Vous pouvez mettre tous vos CC * Transition des objets dans un tableau, et utiliser le nombre aléatoire pour indexer ce tableau:

transition tt = transitions[random]; 
[[CCDirector sharedDirector] replaceScheme:[tt transitionWithDuration: 0.5f scene:s]]; 

Avertissement en aparté, votre nombre aléatoire ne prendra que les valeurs entre 0 et 9. Comme écrit, cas 10, et le défaut ne se produira jamais.

2

Code moins et utilisation de la mémoire extravagante:

NSArray *sceneClasses = [[NSArray arrayWithObjects:[CCFadeTransition class], 
                [CCFadeTRTransition class], 
                /*the whole list of 
                transition types*/ 
                nil] retain]; 

[[CCDirector sharedDirector] replaceScene:[[sceneClasses objectAtIndex:random] transitionWithDuration: 0.5f scene:s]];