将定时器循环设置为固定时间

时间:2012-08-15 12:56:46

标签: objective-c ios loops nstimer

我正在创造一个游戏。当用户完成游戏时,我正在向他展示分数。 为了使它具有互动性,我将分数从0计算到分数。

现在,由于用户可以获得10分或10万分,我不希望hime等待很长时间,所以我希望无论分数是多少都能确定总时间。

所以我这样做了,但似乎定时器间隔不受间隔值的影响。

问题出在哪里?

///score timer
-(void)startScoreCountTimer:(NSNumber*)score{

finishedGameFinalScore = [score integerValue];
CGFloat finishedGameFinalScoreAsFloat = [score floatValue];
CGFloat interval = 2.0f/finishedGameFinalScoreAsFloat;
NSLog(@"interval = %f",interval);

NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:0];
timer = [[NSTimer alloc] initWithFireDate:fireDate
                                 interval:interval
                                   target:self
                                 selector:@selector(timerMethod:)
                                 userInfo:nil
                                  repeats:YES];

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
}

- (void)timerMethod:(NSTimer*)theTimer{

scoreCount++;
finalScoreLabel.text = [NSString stringWithFormat:@"%i",scoreCount];

   if (scoreCount == finishedGameFinalScore ||finishedGameFinalScore ==0) {
    [theTimer invalidate];
    scoreCount=0;
    [self updateMedalsBoard];
   }
}

2 个答案:

答案 0 :(得分:3)

我会使用重复的NSTimer而不是runloop。

aTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerMethod:) userInfo:nil repeats:NO]; 

并将您的timerMethod更改为以下内容:

- (void)timerMethod:(NSTimer*)theTimer{  
     scoreCount = scoreCount + (finishedGameFinalScore * (numberOfSecondsYouWantToRun/100));
     finalScoreLabel.text = [NSString stringWithFormat:@"%i",scoreCount];
     if (scoreCount == finishedGameFinalScore ||finishedGameFinalScore ==0) {
         [theTimer invalidate];
         scoreCount=0;
         [self updateMedalsBoard];
     } else {
         theTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerMethod:) userInfo:nil repeats:NO];
     }
} 

这将使得scoreCount将根据其总分增加一个非固定数字。因此,如果您希望得分计数器运行2秒并且您的球员得分为100,则每十分之一秒会增加2分。如果你的球员得分为10分,那么得分将在每十分之一秒的时间内增加到2000年。

答案 1 :(得分:2)

NSTimers不能保证每个 X 秒(或毫秒,或者在你的情况下,微秒)内完全触发。你只能确定他们会在 X 秒(等)过后的某个时间点火。在您的情况下,看起来您一次只增加一个分数,并且在NSTimer有机会再次触发之前占用主线程的时间,这会减慢整个过程。

更好的方法可能是让计时器重复每次,比如0.1秒,持续2秒。在timerMethod:的每次调用中,加上总得分的1/20,直到达到最后一次迭代的最终总数。当然,您可以使用确切的间隔来找到看起来不错的东西。