Passaggio 6: aggiungere un timer
Si aggiungerà quindi un timer al gioco delle coppie.
Per aggiungere un timer
Andare alla casella degli strumenti in Progettazione Windows Form.Fare doppio clic su Timer (nella categoria Componenti) e aggiungere un timer al form; la relativa icona apparirà in un riquadro grigio sotto il form, come mostrato nell'immagine seguente.
Timer
Fare clic sull'icona timer1 per selezionare il timer.Impostare la proprietà Intervallo su 750, ma lasciare la proprietà Abilitato impostata su False.La proprietà Intervallo indica al timer quanto tempo attendere tra uno scatto e l'altro; in questo caso il timer attenderà tre quarti di secondo (750 millisecondi) prima di generare il primo evento Tick.Non si desidera che il timer venga avviato contemporaneamente all'avvio del programma.Al contrario, si utilizza il metodo Start() per avviare il timer quando il giocatore fa clic sulla seconda etichetta.
Fare doppio clic sull'icona del controllo Timer in Progettazione Windows Form per aggiungere il gestore dell'evento Tick, come mostrato nel codice seguente.
''' <summary> ''' This timer is started when the player clicks ''' two icons that don't match, ''' so it counts three quarters of a second ''' and then turns itself off and hides both icons ''' </summary> ''' <remarks></remarks> Private Sub Timer1_Tick() Handles Timer1.Tick ' Stop the timer Timer1.Stop() ' Hide both icons firstClicked.ForeColor = firstClicked.BackColor secondClicked.ForeColor = secondClicked.BackColor ' Reset firstClicked and secondClicked ' so the next time a label is ' clicked, the program knows it's the first click firstClicked = Nothing secondClicked = Nothing End Sub
/// <summary> /// This timer is started when the player clicks /// two icons that don't match, /// so it counts three quarters of a second /// and then turns itself off and hides both icons /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timer1_Tick(object sender, EventArgs e) { // Stop the timer timer1.Stop(); // Hide both icons firstClicked.ForeColor = firstClicked.BackColor; secondClicked.ForeColor = secondClicked.BackColor; // Reset firstClicked and secondClicked // so the next time a label is // clicked, the program knows it's the first click firstClicked = null; secondClicked = null; }
Il gestore dell'evento Tick effettua tre operazioni: primo, arresta il timer chiamando il metodo Stop().Secondo, utilizza le due variabili di riferimento, firstClicked e secondClicked, per acquisire le due etichette sulle quali il giocatore ha fatto clic e rendere le icone nuovamente invisibili.Infine, reimposta le variabili di riferimento firstClicked e secondClicked su null in Visual C# e su Nothing in Visual Basic.Ciò è importante poiché è così che il programma si reimposta.Ora non sta tenendo traccia di alcun controllo Label ed è nuovamente pronto per il primo clic del giocatore.
[!NOTA]
Un oggetto Timer dispone di un metodo Start() che avvia il timer e di un metodo Stop() che lo arresta.Impostando la proprietà Abilitato del timer su True nella finestra Proprietà, il timer inizia a scattare non appena il programma viene avviato.Se però la si lascia impostata su False, il timer non scatta fino a che non viene chiamato il metodo Start().
[!NOTA]
Di norma, un timer genera l'evento Tick ripetutamente utilizzando la proprietà Intervallo per stabilire quanti millisecondi attendere tra uno scatto e l'altro.Quando il metodo Stop() del timer viene chiamato nell'evento Tick,il timer passa in modalità scatto unico, in modo tale che quando viene chiamato il metodo Start(), il timer attende il relativo intervallo e genera un unico evento Tick.
Per vedere il nuovo timer in azione, andare nell'editor di codice e aggiungere il codice seguente all'inizio e alla fine del metodo del gestore dell'evento label_Click().Si aggiunge l'istruzione if all'inizio e tre istruzioni alla fine; la parte rimanente del metodo resta invariata.
''' <summary> ''' Every label's Click event is handled by this event handler ''' </summary> ''' <param name="sender">The label that was clicked</param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub label_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label9.Click, Label8.Click, Label7.Click, Label6.Click, Label5.Click, Label4.Click, Label3.Click, Label2.Click, Label16.Click, Label15.Click, Label14.Click, Label13.Click, Label12.Click, Label11.Click, Label10.Click, Label1.Click ' The timer is only on after two non-matching ' icons have been shown to the player, ' so ignore any clicks if the timer is running If Timer1.Enabled Then Exit Sub Dim clickedLabel = TryCast(sender, Label) If clickedLabel IsNot Nothing Then ' If the clicked label is black, the player clicked ' an icon that's already been revealed -- ' ignore the click If clickedLabel.ForeColor = Color.Black Then Exit Sub ' If firstClicked is Nothing, this is the first icon ' in the pair that the player clicked, ' so set firstClicked to the label that the player ' clicked, change its color to black, and return If firstClicked Is Nothing Then firstClicked = clickedLabel firstClicked.ForeColor = Color.Black Exit Sub End If ' If the player gets this far, the timer isn't ' running and firstClicked isn't Nothing, ' so this must be the second icon the player clicked ' Set its color to black secondClicked = clickedLabel secondClicked.ForeColor = Color.Black ' If the player gets this far, the player ' clicked two different icons, so start the ' timer (which will wait three quarters of ' a second, and then hide the icons) Timer1.Start() End If End Sub
/// <summary> /// Every label's Click event is handled by this event handler /// </summary> /// <param name="sender">The label that was clicked</param> /// <param name="e"></param> private void label_Click(object sender, EventArgs e) { // The timer is only on after two non-matching // icons have been shown to the player, // so ignore any clicks if the timer is running if (timer1.Enabled == true) return; Label clickedLabel = sender as Label; if (clickedLabel != null) { // If the clicked label is black, the player clicked // an icon that's already been revealed -- // ignore the click if (clickedLabel.ForeColor == Color.Black) return; // If firstClicked is null, this is the first icon // in the pair that the player clicked, // so set firstClicked to the label that the player // clicked, change its color to black, and return if (firstClicked == null) { firstClicked = clickedLabel; firstClicked.ForeColor = Color.Black; return; } // If the player gets this far, the timer isn't // running and firstClicked isn't null, // so this must be the second icon the player clicked // Set its color to black secondClicked = clickedLabel; secondClicked.ForeColor = Color.Black; // If the player gets this far, the player // clicked two different icons, so start the // timer (which will wait three quarters of // a second, and then hide the icons) timer1.Start(); } }
Il codice all'inizio del metodo controlla se il timer è stato avviato selezionando la proprietà Abilitato.In tal modo, se il giocatore fa clic sul primo e sul secondo controllo Label e il timer si avvia, l'eventuale clic su un terzo controllo non genera alcuna azione.
Il codice alla fine del metodo imposta la variabile di riferimento secondClicked in modo da tenere traccia del secondo controllo Label sul quale il giocatore ha fatto clic; imposta inoltre il colore dell'icona di quell'etichetta su nero per renderla visibile.Quindi avvia il timer in modalità scatto unico, in modo che attenda 750 millisecondi prima di generare l'evento Tick.Il gestore dell'evento Tick del timer nasconde quindi le due icone e reimposta le variabili di riferimento firstClicked e secondClicked. Il giocatore potrà così fare clic su un'altra icona nel form.
Salvare ed eseguire il programma.Fare clic su un'icona, che diventerà visibile.
Fare clic su un'altra icona.Questa verrà visualizzata brevemente, quindi entrambe le icone scompariranno.Ripetere più volte.Il form tiene ora traccia della prima e della seconda icona sulla quale si fa clic e utilizza il timer per fare una pausa prima di far scomparire le icone.
Per continuare o rivedere l'esercitazione
Per andare al passaggio successivo dell'esercitazione, vedere Passaggio 7: mantenere le coppie visibili.
Per tornare al passaggio precedente dell'esercitazione, vedere Passaggio 5: aggiungere riferimenti alle etichette.