我正在创造一个游戏。当用户完成游戏时,我正在向他展示分数。 为了使它具有互动性,我将分数从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];
}
}
答案 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,直到达到最后一次迭代的最终总数。当然,您可以使用确切的间隔来找到看起来不错的东西。