2013-03-09 18 views
6

Sto provando a creare un semplice conto alla rovescia in modo che quando un giocatore entra nel mio gioco il timer inizia da 60 a 0. Sembra semplice ma mi confondo su come scrivo questo.(NSTimer) creazione di un conto alla rovescia del timer

Finora ho creato un metodo nel mio GameController.m che assomiglia a questo:

-(int)countDownTimer:(NSTimer *)timer { 
    [NSTimer scheduledTimerWithTimeInterval:-1 
           invocation:NULL 
            repeats:YES]; 
    reduceCountdown = -1; 
    int countdown = [[timer userInfo] reduceCountdown]; 
    if (countdown <= 0) { 
     [timer invalidate]; 
    } 
    return time; 
} 

All'inizio della partita ho inizializzare il tempo intero a 60. L'etichetta è quindi stato impostato all'interno ViewController . Ma nel momento in cui compilo il codice mostra solo l'etichetta a 60 e non diminuisce affatto.

Qualsiasi aiuto sarebbe molto apprezzato - Sono nuovo di Objective-C.


EDIT

con qualche assistenza da ora ho separato il codice in 2 metodi separati. Il codice ora assomiglia a questo:

-(void)countDown:(NSTimer *)timer { 
    if (--time == 0) { 
     [timer invalidate]; 
     NSLog(@"It's working!!!"); 
    } 
} 

-(void)countDownTimer:(NSTimer *)timer { 
    NSLog(@"Hello"); 
    [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
          selector:@selector(countDown:) 
             userInfo:nil 
             repeats:YES]; 
} 

TUTTAVIA, il codice non è ancora in esecuzione correttamente e quando chiamo il metodo [gioco countDownTimer] dal mio controller della vista si rompe dicendo: "selettore non riconosciuto inviato a esempio" . Qualcuno può spiegare cosa c'è di sbagliato qui?

risposta

11

Molte cose sono sbagliate con il codice:

  • si passa un parametro errato per l'intervallo di tempo - i numeri negativi vengono interpretati come i 0,1 ms
  • Si sta chiamando il sovraccarico errato - è necessario passare un oggetto di chiamata, ma si sta passando un NULL
  • Si inserisce il codice che si desidera eseguire sul timer insieme all'inizializzazione del timer - il codice che deve essere eseguito sul timer deve passare in un metodo separato.

È necessario chiamare il sovraccarico che prende un selettore, e passare 1 per l'intervallo, anziché -1.

Declare NSTimer *timer e int remainingCounts, quindi aggiungere

timer = [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
             selector:@selector(countDown) 
             userInfo:nil 
             repeats:YES]; 
remainingCounts = 60; 

al luogo in cui si desidera iniziare il conto alla rovescia.Quindi aggiungere il metodo del conto alla rovescia in sé:

-(void)countDown { 
    if (--remainingCounts == 0) { 
     [timer invalidate]; 
    } 
} 
+0

non sparerebbe una volta di più di quello che vuole in quel modo? Penso che dovrebbe essere '--remainingCounts == 0', no? –

+0

@ Daij-Djan Hai ragione, dovrebbe essere 'remainingCounts = 59' o' --remainingCounts'. Grazie! – dasblinkenlight

+0

Grazie per il tuo feedback dasblinkenlight. Tuttavia, ancora lottando per farlo funzionare! Al momento il mio selettore non sta comunicando con il metodo countDown, cioè non succede niente quando compilo il codice. Questo potrebbe essere dovuto al fatto che il timer non è stato avviato o che non sono collegati? –

0

Dalla domanda che hai posto. Puoi ottenere ciò invocando una funzione per ogni 1 sec e gestendo la logica di decremento in questo.

Snippet: -

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1.0 
         target: self 
         selector:@selector(onTick:) 
         userInfo: nil repeats:YES]; 
(void)onTick 
{ 
    //do what ever you want 
    NSLog(@"i am called for every 1 sec"); 
//invalidate after 60 sec [timer invalidate]; 
} 
+0

faccio a scrivere il metodo onTick entro lo stesso metodo della CountdownTimer? –

+0

è possibile utilizzare il metodo CountdownTimer stesso invece di onTick mi dispiace di confonderti scrivendo il nome di un metodo diverso. –

1

Prova questa

- (void)startCountdown 
{ 
    _counter = 60; 

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 
                 target:self 
                selector:@selector(countdownTimer:) 
                userInfo:nil 
                repeats:YES]; 
} 

- (void)countdownTimer:(NSTimer *)timer 
{ 
    _counter--; 
    if (_counter <= 0) { 
     [timer invalidate]; 
     // Here the counter is 0 and you can take call another method to take action 
     [self handleCountdownFinished]; 
    } 
} 
+0

Grazie per la tua risposta: come mai hai usato i caratteri di sottolineatura prima del tuo intero? Perché devo fare questo? –

+0

Ho effettuato il contatore di una proprietà e con le proprietà auto sintetizzate Xcode utilizza un trattino di sottolineatura. – bbarnhart

+0

continua a dire "Uso dell'identificatore non dichiarato" _counter, come posso risolvere questo? –

Problemi correlati