Partager via


Étape 6 : ajouter une minuterie

Ensuite, ajoutez une minuterie au jeu de combinaisons.

Pour ajouter une minuterie

  1. Allez dans la Boîte à outils du Concepteur Windows Forms.Double-cliquez sur Minuterie dans la catégorie Composants et ajoutez une minuterie au formulaire (son icône s'affiche dans une zone grise au-dessous du formulaire, comme indiqué dans l'image suivante).

    Minuterie

    Minuterie

  2. Cliquez sur l'icône timer1 pour sélectionner la minuterie.Affectez la valeur 750 à la propriété Interval, mais ne modifiez pas la valeur False du jeu de propriétés Enabled.La propriété Interval indique à la minuterie le temps d'attente entre les battements d'horloge. Cette valeur indique donc à la minuterie qu'elle doit attendre trois quarts de seconde (750 millisecondes) avant de déclencher son premier événement Tick.Vous ne voulez pas que la minuterie démarre en même temps que le programme.À la place, utilisez la méthode Start() pour démarrer la minuterie lorsque le joueur clique sur le deuxième contrôle Label.

  3. Double-cliquez sur l'icône du contrôle Timer dans le Concepteur Windows Forms pour ajouter le gestionnaire d'événements Tick, comme indiqué dans le code suivant.

    ''' <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;
    }
    

    Le gestionnaire d'événements Tick effectue trois opérations : tout d'abord, il arrête la minuterie en appelant la méthode Stop().Ensuite, il utilise les deux variables de référence, firstClicked et secondClicked, pour sélectionner les deux contrôles Label sur lesquels le joueur a cliqué et masquer à nouveau leurs icônes.Enfin, il réinitialise les variables de référence firstClicked et secondClicked à la valeur null en Visual C# et Nothing en Visual Basic.Cette opération est importante car elle permet au programme de se réinitialiser.Maintenant que le programme ne suit plus aucun contrôle Label, il est de nouveau prêt pour le premier clic du joueur.

    [!REMARQUE]

    Un objet Timer a une méthode Start() qui démarre la minuterie et une méthode Stop() qui l'arrête.Lorsque vous affectez la valeur True à la propriété Enabled de la minuterie dans la fenêtre Propriétés, elle commence à égrener les secondes dès que le programme démarre.Mais si vous ne modifiez pas la valeur False, la minuterie attend que sa méthode Start() soit appelée pour commencer à égrener les secondes.

    [!REMARQUE]

    Normalement, une minuterie déclenche sans cesse son événement Tick à l'aide de la propriété Interval pour déterminer le temps d'attente en millisecondes entre les battements d'horloge.Vous aurez éventuellement remarqué que la méthode Stop() de la minuterie est appelée dans l'événement Tick.La minuterie passe ainsi en mode déclenchement unique pour attendre son intervalle et déclencher un seul événement Tick lorsque la méthode Start() est appelée.

  4. Pour voir la nouvelle minuterie en action, allez dans l'éditeur de code et ajoutez le code suivant en haut et en bas de la méthode du gestionnaire d'événements label_Click().(Ajoutez une instruction if en haut et trois instructions en bas ; le reste de la méthode ne change pas.)

    ''' <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();
        }
    }
    

    Le code en haut de la méthode contrôle si la minuterie a été démarrée en vérifiant la propriété Enabled.Ainsi, rien ne se passera si le joueur clique sur un troisième contrôle Label après avoir cliqué sur les premier et deuxième contrôles.

    Le code en bas de la méthode indique à la variable de référence secondClicked qu'elle doit effectuer le suivi du deuxième contrôle Label sur lequel le joueur a cliqué et changer la couleur de l'icône de ce contrôle en noir pour le rendre visible.Elle démarre ensuite la minuterie en mode déclenchement unique et attend 750 millisecondes avant de déclencher l'événement Tick.Le gestionnaire d'événements Tick de la minuterie masque ensuite les deux icônes et réinitialise les variables de référence firstClicked et secondClicked pour que le joueur puisse cliquer sur une autre icône dans le formulaire.

  5. Enregistrez et exécutez votre programme.Cliquez sur une icône et elle devient visible.

  6. Cliquez sur une autre icône.Elle s'affiche brièvement, puis les deux icônes disparaissent.Répétez cette opération plusieurs fois.Le formulaire effectue maintenant le suivi des première et deuxième icônes sur lesquelles vous cliquez et utilise la minuterie pour mettre le jeu en pause avant de masquer les icônes.

Pour continuer ou examiner