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

runloop の代わりに繰り返し NSTimer を使用します。

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 点を獲得した場合、10 分の 1 秒ごとに 2 ポイント増加します。プレーヤーが 100,000 ポイントを獲得した場合、スコアは 10 分の 1 秒ごとに 2000 ずつ増加します。

于 2012-08-15T13:05:52.253 に答える
2

NSTimersは、 X秒(またはミリ秒、場合によってはマイクロ秒)ごとに正確に起動することは保証されていません。X秒(など)が経過した後、いつか発火することを確実に知ることができます。あなたの場合、一度に1ポイントだけスコアをインクリメントしているように見えます。これは、NSTimerが再度起動する機会を得る前にメインスレッドで時間がかかり、プロセス全体の速度が低下します。

より良いアプローチは、タイマーをたとえば0.1秒ごとに2秒間繰り返すことです。の各呼び出しでtimerMethod:、最後の反復で最終的な合計に達するまで、合計スコアの1/20を追加します。もちろん、正確な間隔で遊んで、見栄えのするものを見つけることもできます。

于 2012-08-15T13:07:01.903 に答える