0

カウントダウンタイマーを使用するゲームがあり、タイマーが切れると、ゲームオーバービューに移動します。ボタンをタップすると、タイマーに1、2、または3秒追加される機能を追加したいと思います。タイマーのコード (以下) は既にありますが、カウンターにさらに時間を追加する方法を知る必要があります。私はそれについて考えましたが、ビューがいつ切り替わるかを言わなければならず、追加された時間をカウントする必要があります.

コード:

-(IBAction)Ready:(id)sender {
    [self performSelector:@selector(TimerDelay) withObject:nil afterDelay:1.0];
    [self performSelector:@selector(delay) withObject:nil afterDelay:36.5];
}

-(void)TimerDelay {
    MainInt = 36;

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                         target:self
                                       selector:@selector(countDownDuration)
                                       userInfo:nil
                                        repeats:YES];
    if (timer == 0)
    {
        [timer invalidate];
    }
}

-(void)countDownDuration {
    MainInt -= 1;

    seconds.text = [NSString stringWithFormat:@"%i", MainInt];
}

-(void)delay {

    GameOverView1_4inch *second= [self.storyboard instantiateViewControllerWithIdentifier:@"GameOverView1"];
    second.finalScore = self.currentScore;
    [self presentViewController:second animated:YES completion:nil];
}
4

4 に答える 4

1

タイマーを使用してゲームを管理している場合、同時に実行セレクターを使用すると (ゲームを終了するためなど)、ポイントが無効になり、管理が非常に複雑になります。1 つのルートを選択し、それに固執します。

タイマーの実行中は、 を使用して開始日を変更できますsetFireDate:。したがって、現在の発火日を取得し、それに時間を追加してから、新しい発火日を設定できます。

- (void)extendByTime:(NSInteger)seconds
{
    NSDate *newFireDate = [[self.timer fireDate] dateByAddingTimeInterval:seconds];
    [self.timer setFireDate:newFireDate];
}

次に、ボタンのコールバックは次のようになります。

- (void)buttonOnePressed:(id)sender
{
    [self extendByTime:1];
}

- (void)buttonFivePressed:(id)sender
{
    [self extendByTime:5];
}

performSelectorwhich 呼び出しを削除するとdelay、ゲームの終了は MainIntゼロになることで定義されます。

余談ですが、これをしないでください:

if (timer == 0)

正しいアプローチは次のとおりです。

if (timer == nil)

そして、タイマーがゼロの場合、それを無効にしようとしても意味がありません...

また、Objective-C命名ガイドラインを参照することをお勧めします。


最近のコメントに基づいて、実際にはタイマーが秒間隔でカウントし続けたいが、残りの秒数にのみ時間を追加したいようです。これはさらに簡単で、タイマーの起動日を変更する必要はありません。

- (void)extendByTime:(NSInteger)seconds {
    MainInt += seconds;
    seconds.text = [NSString stringWithFormat:@"%i", MainInt];
}

「countDownDuration」にチェックを追加する必要があります。

if (MainInt <= 0) {
    [timer invalidate];
    [self delay];
}

いつ終了するかを決定します。

于 2013-06-23T14:17:45.070 に答える
0

ねえ、これを使ってみてください:

これを-(void)viewDidLoadメソッドに入れます

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self
                                                   selector:@selector(countDownTimer) userInfo:nil repeats:YES];

-(void)countDownTimerメソッドを作成します

- (void)countDownTimer {
    // my method which returns the differences between two dates in my case
    double diff = [self getDateDifference];

    double days     = trunc(diff / (60 * 60 * 24));
    double seconds  = fmod(diff, 60.0);
    double minutes  = fmod(trunc(diff / 60.0), 60.0);
    double hours    = fmodf(trunc(diff / 3600.0), 24);

    if(diff > 0) {
        NSString *countDownString = [NSString stringWithFormat:@"%02.0f day(s)\n%02.0f:%02.0f:%02.0f",
                           days, hours, minutes, seconds];
        // IBOutlet label, added in .h
        self.labelCountDown.text= countDownString;
    } else {
        // stoping the timer
        [timer invalidate];
        timer = nil;
        // do something after countdown ...
    }
}

私の場合、2つの日付の差を返す- (double)getDateDifferenceメソッドを追加できます

- (double)getDateDifference {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSDate *dateFromString = [[NSDate alloc] init];
    NSDate *now = [NSDate date];
    NSString *myDateString = @"2013-10-10 10:10:10"; // my initial date with time
    // if you want to use only time, than delete the 
    // date in myDateString and setDateFormat:@"HH:mm:ss"

    // this line is not required, I used it, because I need GMT+2
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:+2]];

    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    // get the date
    dateFromString = [dateFormatter dateFromString:myDateString];

    // this line is also not required, I used it because I need GMT+2
    // so I added two hours in seconds to 'now'
    now = [now dateByAddingTimeInterval:60*60*2];

    // getting the difference
    double diff = [dateFromString timeIntervalSinceDate:now];

    NSLog(@"dateString: %@", dateString);
    NSLog(@"now: %@", now);
    NSLog(@"targetDate: %@", dateFromString);
    NSLog(@"diff: %f", diff);

   return diff;
}

出力はこれに似ています

dateString: 2013-10-10 00:20:00
now: 2013-10-10 00:20:00 +0000
target: 2013-10-10 00:20:28 +0000
diff: 28.382786

お役に立てば幸いです

于 2013-10-10T11:09:50.007 に答える
0

使用できるライブラリは次のとおりです。

https://github.com/akmarinov/AMClock

于 2013-10-10T12:00:40.243 に答える
0

タイマーを開始した時間の参照を保持できます。次に、余分な時間を追加したい場合は、タイマーが開始してからの経過時間を計算し、タイマーを無効にして、前のタイマーの残り時間と余分な秒との差を時間間隔として渡す新しいタイマーを作成します。

于 2013-06-23T14:16:56.167 に答える