Таймер обратного отсчета iphone SDK? - PullRequest
3 голосов
/ 13 февраля 2010

У меня есть таймер обратного отсчета в моей игре, и я пытаюсь выяснить, как сделать так, чтобы он отображал два десятичных знака и записи с двумя десятичными знаками в моей таблице. Прямо сейчас он отсчитывает как целое число и записывает как целое число. Есть идеи?

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

1 Ответ

2 голосов
/ 13 февраля 2010

Для получения обновлений менее секунды интервал таймера должен быть <1. Но точность NSTimer составляет всего около 50 мс, поэтому <code>scheduledTimerWithTimeInterval:0.01 не будет работать.

Кроме того, таймер может быть задержан из-за различных действий, поэтому использование timeSeconds приведет к неточной синхронизации. Обычный способ - сравнить NSDate с датой запуска таймера. Однако, поскольку этот код предназначен для игры, текущий подход может вызвать меньше разочарования у игроков, особенно. если программа или фоновые процессы потребляют много ресурсов.


Первое, что нужно сделать, - это преобразовать countdownTimer в субсекундный интервал.

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

Тогда не отсчитывайте время по секундам, а по центам:

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

Наконец, разделите на 100 в выводе:

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

В качестве альтернативы используйте double:

double timeSeconds;
...
if(appDelegate.gameStateRunning == YES){
   if(gameVarLevel==1){
      timeSeconds = 100;
      AllowResetTimer = NO;
   }
}
timeSeconds -= 0.67;
timerLabel.text=[NSString stringWithFormat:@"Time: %.2g", timeSeconds];
...