0

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

现在,由于用户可以赚取 10 分或 100,000,我不想让他等太久,所以我希望无论分数如何,总时间都是固定的。

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

哪里有问题 ?

///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];
   }
}
4

2 回答 2

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 分。如果您的玩家得分 100,000 分,那么分数将每十分之一秒增加 2000 分。

于 2012-08-15T13:05:52.253 回答
2

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

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

于 2012-08-15T13:07:01.903 回答