2012-01-10 48 views
4

我創建一個簡單的乒乓遊戲.. 現在我想設置一個計時器,將停止後,我失去和保存價值高的分數可能,但即使我設法設定了計時器並設定了他,似乎不想停下來。的iOS乒乓發展,計時器不會停止

我使用本教程中實現它: http://www.apptite.be/tutorial_ios_stopwatch.php

現在我的代碼如下所示:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (StavHry == StavHryPozastaven) { 
     TapToBegin.hidden = YES; 
     StavHry = StavHryAktivni; 
    } else if (StavHry == StavHryAktivni) { 
     [self touchesMoved:touches withEvent:event]; 
    } 
    startDate = [NSDate date]; 

    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self selector:@selector(updateTimer)userInfo:nil repeats:YES]; 
} 

- (void)updateTimer 
{ 
    static NSInteger counter = 0; 
    StopWatchLabel.text = [NSString stringWithFormat:@"Counter: %i", counter++]; 

    NSDate *currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate]; 
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"HH:mm:ss.SSS"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; 
    NSString *timeString=[dateFormatter stringFromDate:timerDate]; 
    StopWatchLabel.text = timeString; 
} 

我計時器設置當我TapToBegin標籤上點擊.. 但是當我寬鬆或贏得計時器只是繼續運行,即使我在使用無效的功能之前,開始一個新的遊戲..(當我開始一個新的遊戲它重置)

-(void)reset:(BOOL) novahra { //funkce reset 
    self.StavHry = StavHryPozastaven; 
    mic.center = self.view.center; 
    if(novahra) { 
     if(skore_hrac_hodnota < skore_pc_hodnota){ 
      TapToBegin.text = @"Protivnik Vyhrál, smůla!"; 
      [stopWatchTimer invalidate]; 
     } else { 
      TapToBegin.text = @"Vyhráls! Gratulujem!"; 
      [stopWatchTimer invalidate]; 
     } 
     skore_hrac_hodnota = 0; 
     skore_pc_hodnota = 0; 
    } else { 
     self.StavHry = StavHryAktivni; 
     //TapToBegin.text = @"Pokračuj!"; 
    } 

    skore_hrac.text = [NSString stringWithFormat:@"%d", skore_hrac_hodnota]; 
    skore_pc.text = [NSString stringWithFormat:@"%d", skore_pc_hodnota]; 
} 

我知道教程顯示了更多的停止行爲代碼,但我嘗試了更多的選擇,我給了它所有的東西,但我認爲這是停止計時器的唯一行,因此它應該可以工作。但事實並非如此。

請大家幫忙,我有一個因在週一完成這一點,所以我嚇壞了一點點。

+0

定時器只會在你調用'invalidate'時停止 - 就像你在'reset:'中做的那樣。當你贏或輸時,你是否在計時器上稱「無效」? – 2012-01-10 14:53:48

+0

嗯,我想我做的..至少這是什麼,在我看來在我這裏張貼'如果(skore_hrac_hodnota 2012-01-10 15:19:43

+5

+1製作傍代碼學習遊戲編碼而不是RPG或其他一些無法完成的超級項目。 – 2012-01-10 15:29:19

回答

2

如果touchesBegan:被稱爲不止一次和reset:不叫之間更會發生什麼?如果可能發生,您可能會泄漏一個計時器,該計時器將繼續調用您的updateTimer方法。

如果你發佈的代碼的工作原理是定時器方法應該有一個參數,那麼我有點驚訝。這是將您的計時器選擇器更改爲@selector(updateTimer:),然後更改爲方法- (void)updateTimer:(NSTimer *)timer

+0

我不認爲touchesBegan可以被稱爲不止一次沒有調用重置:中間..(我不知道,雖然我是一個n00b),但它是一個乒乓球比賽時,點被射入一方reset:函數被調用,我不知道怎麼可能不止一次地調用touchesBegan函數。無論如何.. – 2012-01-10 15:15:06

+0

..我做了你說的..謝謝..但仍然需要停止計時器。 – 2012-01-10 15:15:40

+0

當您創建並使計時器無效時,添加'NSLog'或斷點,然後您會看到它們是否匹配。 – 2012-01-10 15:22:04