Поделиться через


Шаг 6. Добавление таймера

Далее, добавьте в игру "Подбери пару!" таймер.

Добавление таймера

  1. Перейдите к панели элементов в конструкторе Windows Forms.Дважды щелкните Timer (в категории Компоненты) и добавьте в форму таймер. Его значок появится в сером поле под формой, как показано на следующем рисунке.

    Таймер

    Таймер

  2. Щелкните значок timer1 для выбора таймера.Задайте свойству Interval значение 750, но оставьте свойству Enabled значение False.Свойство Interval задает таймеру время ожидания между тактами, тем самым оно указывает таймеру подождать три четверти секунды (750 миллисекунд), прежде чем запустить свое первое событие Tick.Вы не хотите запускать таймер при запуске программы.Вместо этого воспользуйтесь методом Start() для запуска таймера при нажатии игроком второй метки.

  3. Дважды щелкните значок элемента управления Timer в конструкторе Windows Forms для добавления обработчика событий Tick, как показано в следующем коде.

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

    Обработчик события Tick выполняет три действия. Сначала он останавливает таймер, вызывая метод Stop().Затем он использует две ссылочные переменные, firstClicked и secondClicked, чтобы снова сделать невидимыми значки двух меток, которые щелкнул игрок.Наконец, он сбрасывает значения ссылочных переменных firstClicked и secondClicked на null в Visual C# и Nothing в Visual Basic.Это важно, поскольку таким образом программа сбрасывает саму себя.Теперь она не отслеживает какие-либо элементы управления Label и снова готова к первому щелчку игрока.

    ПримечаниеПримечание

    У объекта Timer есть метод Start(), который запускает таймер, и метод Stop(), который останавливает его.Если в окне Свойства свойству таймера Enabled задать значение True, он начнет отсчет сразу же, как только запустится программа.Но если в этом свойстве оставить значение False, отсчет не начнется, пока не будет вызван метод Start().

    ПримечаниеПримечание

    Как правило, таймер запускает событие Tick снова и снова, используя свойство Interval, чтобы определить, сколько миллисекунд ждать между тактами.Обратите внимание на вызов метода таймера Stop() внутри события Tick.Таймер переходит в режим однократного действия, поэтому при вызове метода Start() он ожидает в течение своего интервала, а затем запускает одно событие Tick.

  4. Чтобы увидеть работу нового таймера, перейдите к редактору кода и добавьте следующий код в начало и конец метода обработчика событий label_Click().(Добавляется оператор if в начало метода и три оператора в конец. Остальная часть метода остается неизменной.)

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

    Код в начале метода проверяет, запущен ли таймер, обращаясь к свойству Enabled.Таким образом, если игрок щелкнет первый и второй элемент управления Label и таймер запуститься, щелчок третьего элемента управления ни к чему не приведет.

    Код в конце метода задает ссылочную переменную secondClicked таким образом, чтобы она отслеживала второй элемент управления Label, который щелкнул игрок, и задает этой метке черный цвет значка, чтобы сделать ее видимой.Затем таймер запускается в однократном режиме, то есть ожидает 750 миллисекунд и после этого запускает событие Tick.Далее обработчик событий Tick таймера скрывает два значка и сбрасывает значения ссылочных переменных firstClicked и secondClicked, таким образом форма готова к щелчку игроком другого значка.

  5. Сохраните и выполните программу.Щелкните значок, и он станет видимым.

  6. Щелкните другой значок.Он появляется на короткое время, а затем оба значка исчезают.Повторите это несколько раз.В форме отслеживаются первый и второй значок, которые вы щелкнули, и используется таймер для паузы перед исчезновением значков.

Продолжить или повторить пройденный материал