2009-06-07 3 views
1

Je crée un jeu-questionnaire et je ne peux pas comprendre la meilleure façon d'implémenter les UIButtons qui disparaissent un par un à 3 secondes d'intervalle. Je peux faire disparaître le premier UIButton au bout de 3 secondes, mais les UIButtons suivants prennent beaucoup plus de temps.iPhone Comment: UIButtons qui disparaissent un par un à l'intervalle défini

Je crois que le problème est que mon code devient plus inefficace avec chaque UIButton que je fais disparaître. La méthode suivante est ce que j'appelle avec un NSInterval répétitif pour faire disparaître chaque UIButton suivante:

- (void) hideButton { int buttonNum;

while(buttonNum != -1) 
{ 
    buttonNum = rand() % 5; 

    if(buttonNum != [quiz correctNumber]) 
    { 
     if(buttonNum == 0 && [buttonOne isEnabled] == YES) 
     { 
      [UIView beginAnimations:@"buttonFades" context:nil]; 
      [UIView setAnimationDuration:0.5]; 
      [buttonOne setEnabled:NO]; 
      [buttonOne setAlpha:0.0]; 
      [UIView commitAnimations]; 
     } 
     else if(buttonNum == 1 && [buttonTwo isEnabled] == YES) 
     { 
      [UIView beginAnimations:@"buttonFades" context:nil]; 
      [UIView setAnimationDuration:0.5]; 
      [buttonTwo setEnabled:NO]; 
      [buttonTwo setAlpha:0.0]; 
      [UIView commitAnimations]; 
     } 
     else if(buttonNum == 2 && [buttonThree isEnabled] == YES) 
     { 
      [UIView beginAnimations:@"buttonFades" context:nil]; 
      [UIView setAnimationDuration:0.5]; 
      [buttonThree setEnabled:NO]; 
      [buttonThree setAlpha:0.0]; 
      [UIView commitAnimations]; 
     } 
     else if(buttonNum == 3 && [buttonFour isEnabled] == YES) 
     { 
      [UIView beginAnimations:@"buttonFades" context:nil]; 
      [UIView setAnimationDuration:0.5]; 
      [buttonFour setEnabled:NO]; 
      [buttonFour setAlpha:0.0]; 
      [UIView commitAnimations]; 
     } 
     else if(buttonNum == 4 && [buttonFive isEnabled] == YES) 
     { 
      [UIView beginAnimations:@"buttonFades" context:nil]; 
      [UIView setAnimationDuration:0.5]; 
      [buttonFive setEnabled:NO]; 
      [buttonFive setAlpha:0.0]; 
      [UIView commitAnimations]; 
     } 

     buttonNum = -1; 
    } 
} 

}

Répondre

3

Lorsque vous suffit, par exemple, 2 boutons à gauche, puisque vous encore générer un nombre aléatoire entre 0 et 4, vous n'avez une chance de 20% de faire en fait un bouton plus disparaître - - 20% du temps, vous ne faites rien parce que le nombre aléatoire correspond à la bonne, et 60% du temps dans ces conditions vous ne ferez rien car il correspond à un bouton déjà disparu.

Je vous suggère de conserver un tableau initialement rempli avec les références des 4 boutons qui peuvent réellement disparaître (ne vous embêtez pas à mettre le numéro correct là car vous ne le ferez jamais disparaître de toute façon). Dans votre fonction, générez un nombre aléatoire compris entre 0 et N-1 lorsque vous avez laissé N boutons dans ce tableau, vous pouvez donc supprimer le bouton approprié avec un code efficace et concis - alors (si le bouton qui a disparu n'était pas le dernier un dans le tableau) l'échange avec le dernier et décrémente N par un. Bien sûr, lorsque N vaut 1, le nombre aléatoire n'est pas non plus nécessaire.

+1

Cela a très bien fonctionné. Merci –

1

Bonne réponse d'Alex Martelli. Une autre possibilité serait de remplacer les objets séparés buttonOne, buttonTwo, etc. avec un seul tableau de boutons, le bouton [5] et remplacer votre grande boucle avec ceci:

do { 
    buttonNum = rand() % 5; 
} while (buttonNum == [quiz correctNumber] || ![buttons[buttonNum] isEnabled]); 

[buttons[buttonNum] setEnabled:NO]; // Doesn't need to be in animation block 
[UIView beginAnimations:@"buttonFades" context:nil]; 
[UIView setAnimationDuration:0.5]; 
[buttons[buttonNum] setAlpha:0.0]; 
[UIView commitAnimations]; 

*** Dan, ci-dessous: Quelque chose à randomiser l'ordre du bouton se cacher et s'assurer que la bonne réponse n'était pas cachée serait toujours nécessaire, mais sinon c'est aussi une excellente solution.

1

Une autre façon de faire les boutons disparaissent à intervalles réguliers est d'utiliser la méthode

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 

. Pour l'utiliser, vous définir une fonction pour un bouton disparaît quand il est appelé:

-(void)hideButton:(UIButton *)button{ 
button.enabled = NO; 
[UIView beginAnimations:@"buttonFades" context:nil]; 
[UIView setAnimationDuration:0.5]; 
[button setAlpha:0.0]; 
[UIView commitAnimations]; 
} 

Ensuite, vous cracher les sélecteurs retardées dans une boucle comme ceci:

for(int i=0; i<numButtons; i++){ 
    [self performSelector:@selector(mySelector:) withObject:buttons[i] afterDelay:3*i+3] 
} 
Questions connexes