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


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

Затем добавьте в игру "Подбери пару" элемент управления Таймер.Таймер ожидает заданное число миллисекунд, а затем вызывает событие, называемое тактом.Это бывает удобно для запуска действия или повтора действия с определенной периодичностью.В этом случае таймер нужен для того, чтобы игроки могли выбрать два значка, а если они не совпадают, скрыть их через небольшой отрезок времени.

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

  1. На панели элементов в конструкторе Windows Forms выберите Таймер (в категории Компоненты ), а затем нажмите клавишу ВВОД или дважды щелкните таймер, чтобы добавить его в форму.Значок с именем таймера Timer1 должен появиться в пространстве под формой, как показано на следующем рисунке.

    Таймер

    Таймер

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

    Если панель элементов пуста, проверьте, что перед ее открытием был выбран конструктор форм, а не код формы.

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

  3. Выберите значок элемента управления "Таймер" в конструкторе 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 и таймер запускается, выбор третьего элемента управления Label ни к чему не приведет.

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

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

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

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