Passaggio 6: aggiungere un timer

Aggiungere ora un controllo Timer al gioco delle coppie.Un timer resta in attesa per un determinato numero di millisecondi prima di generare un evento, definito ciclo.Si tratta di una condizione utile per avviare un'azione o ripeterne una a intervalli regolari.In questo caso, verrà utilizzato un timer per consentire ai giocatori di scegliere due icone e, se non corrispondono, nasconderle di nuovo dopo un breve periodo di tempo.

Per aggiungere un timer

  1. Nella casella degli strumenti in Progettazione Windows Form scegliere Timer (nella categoria Componenti), quindi premere il tasto INVIO oppure fare doppio clic sul timer per aggiungere un controllo al form.L'icona del timer, chiamata Timer1, verrà visualizzata in uno spazio al di sotto del form, come mostrato nell'immagine seguente.

    Timer

    Timer

    [!NOTA]

    Se la casella degli strumenti è vuota, assicurarsi di selezionare la finestra di progettazione del form e non il codice retrostante prima di aprire la casella degli strumenti.

  2. Scegliere l'icona Timer1 per selezionare il timer.Nella finestra Proprietà passare dalla visualizzazione degli eventi a quella delle proprietà.Impostare quindi la proprietà Intervallo del timer su 750, ma lasciare la proprietà Abilitato impostata su False.La proprietà Intervallo indica al timer il periodo di attesa tra cicli o il momento in cui verrà generato l'evento Tick.Il valore 750 indica al timer di attendere tre quarti di secondo (750 millisecondi) prima di generare il relativo evento Tick.Il metodo Start() per avviare il timer verrà chiamato solo dopo che il giocatore avrà scelto la seconda etichetta.

  3. Scegliere l'icona del controllo Timer in Progettazione Windows Form, quindi premere il tasto INVIO o fare doppio clic sul timer per aggiungere un gestore eventi Tick.Sostituire il codice con quello indicato di seguito oppure immettere manualmente il codice seguente nel gestore eventi.

    ''' <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 eventi Tick effettua tre operazioni: in primo luogo verifica che il timer non sia in esecuzione chiamando il metodo Stop().In seconda istanza, utilizza le due variabili di riferimento, firstClicked e secondClicked, per rendere nuovamente invisibili le due etichette scelte dal giocatore.Infine, reimposta le variabili di riferimento firstClicked e secondClicked su null in Visual C# e su Nothing in Visual Basic.Questo passaggio è importante, poiché è così che il programma si reimposta.Ora non sta tenendo traccia di alcun controllo Label ed è nuovamente pronto per la scelta di un'etichetta da parte 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().Di norma, un timer genera l'evento Tick ripetutamente utilizzando la proprietà Intervallo per stabilire quanti millisecondi attendere tra un ciclo 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 l'intervallo specificato, genera un unico evento Tick e quindi si arresta.

  4. 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 il valore della proprietà Abilitato.In tal modo, se il giocatore sceglie il primo e il secondo controllo Label e il timer si avvia, l'eventuale scelta di una terza etichetta 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 scelto dal giocatore, quindi imposta 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 un singolo evento Tick.Il gestore eventi Tick del timer nasconde quindi le due icone e reimposta le variabili di riferimento firstClicked e secondClicked. Il giocatore potrà così scegliere un'altra coppia di icone nel form.

  5. Salvare ed eseguire il programma.Scegliere un'icona, che diventerà visibile.

  6. Specificare 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 scelta e utilizza il timer per fare una pausa prima di far scomparire le icone.

Per continuare o rivedere l'esercitazione