Question

J'ai un compte à rebours dans mon jeu et je suis en train de comprendre comment faire en sorte que cela montre deux décimales et enregistrements avec 2 décimales dans ma table. En ce moment, il compte à rebours comme un nombre entier et enregistre un nombre entier. Toutes les idées?

-(void)updateTimerLabel{

     if(appDelegate.gameStateRunning == YES){

                            if(gameVarLevel==1){
       timeSeconds = 100;
       AllowResetTimer = NO;
       }
    timeSeconds--;
    timerLabel.text=[NSString stringWithFormat:@"Time: %d", timeSeconds];
}

    countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimerLabel) userInfo:nil repeats:YES];
Était-ce utile?

La solution

Pour avoir des mises à jour de sous-secondes, l'intervalle de la minuterie doit être <1. Mais la précision de NSTimer est à seulement 50 ms, donc scheduledTimerWithTimeInterval:0.01 ne fonctionnera pas.

En outre, la minuterie peut être retardée par diverses activités, donc l'utilisation timeSeconds entraînera une erreur de chronométrage. La manière habituelle est de comparer le NSDate maintenant avec la date à laquelle la minuterie commence. Cependant, ce code est un jeu, l'approche actuelle peut causer moins de frustration pour les joueurs esp. si les processus de programme ou de fond beaucoup de ressources.


La première chose à faire est de convertir le countdownTimer à intervalle sous-secondes.

countdownTimer = [NSTimer scheduledTimerWithTimeInterval:0.67 target:self selector:@selector(updateTimerLabel) userInfo:nil repeats:YES];

Alors, ne comptez pas sur le temps en secondes, mais centiseconds:

if(appDelegate.gameStateRunning == YES){
   if(gameVarLevel==1){
      timeCentiseconds = 10000;
      AllowResetTimer = NO;
   }
}
timeCentiseconds -= 67;

Finalement, diviser par 100 à la sortie:

timerLabel.text=[NSString stringWithFormat:@"Time: %d.%02d", timeCentiseconds/100, timeCentiseconds%100];

Vous pouvez également utiliser un double:

double timeSeconds;
...
if(appDelegate.gameStateRunning == YES){
   if(gameVarLevel==1){
      timeSeconds = 100;
      AllowResetTimer = NO;
   }
}
timeSeconds -= 0.67;
timerLabel.text=[NSString stringWithFormat:@"Time: %.2g", timeSeconds];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top