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


Руководство. Добавление ссылочных переменных и элемента управления таймером в соответствующее приложение WinForms игры

В этой серии четырех руководств вы создаете соответствующую игру, где игрок сопоставляет пары скрытых значков.

Программа игры на совпадение должна отслеживать, какие элементы управления Label выбирает игрок. После выбора первой метки проигрыватель должен отобразить значок. После выбора второй метки программа должна отображать оба значка в течение короткого времени. Затем он скрывает оба значка.

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

  • Добавьте ссылки на метки.
  • Добавьте таймер.

Необходимые условия

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

Добавление ссылок на метки

В этом разделе вы добавите два ссылочных переменных в код. Они отслеживают объекты Label или ссылаются на объекты Label.

  1. Добавьте ссылки на метки в форму с помощью следующего кода в Form1.cs или Form1.vb.

    public partial class Form1 : Form
    {
        // firstClicked points to the first Label control 
        // that the player clicks, but it will be null 
        // if the player hasn't clicked a label yet
        Label firstClicked = null;
    
        // secondClicked points to the second Label control 
        // that the player clicks
        Label secondClicked = null;
    

Если вы используете C#, поместите код после открывающей фигурной скобки и сразу после объявления класса (public partial class Form1 : Form). Если вы используете Visual Basic, поместите код сразу после объявления класса (Public Class Form1).

Эти инструкции не приводят к отображению элементов управления Label в форме, так как ключевое слово new отсутствует. При запуске программы firstClicked и secondClicked заданы null для C# или Nothing для Visual Basic.

  1. Измените обработчик событий Click в Form1.cs или Form1.vb, чтобы использовать новую ссылочную переменную firstClicked. Удалите последнюю инструкцию в методе обработчика событий label1_Click() (clickedLabel.ForeColor = Color.Black;) и замените его инструкцией 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>
    private void label1_Click(object sender, EventArgs e)
    {
        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;
            }
        }
    }
    

  1. Сохраните и запустите программу. Выберите один из элементов управления меткой и появится его значок. Выберите следующий элемент управления меткой и заметьте, что ничего не происходит.

    снимок экрана: игра сопоставления с одним значком.

    Появится только первый значок, выбранный. Другие значки невидимы.

Программа уже отслеживает первую метку, которую выбрал игрок. Ссылка firstClicked не null в C# или Nothing в Visual Basic. Когда оператор if находит, что firstClicked не равно null или Nothing, он выполняет инструкции.

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

Приложение Matching Game использует элемент управления Timer. Таймер ожидает, а затем запускает событие, называемое галочки. Таймер может запускать действие или регулярно повторять действие.

В программе таймер позволяет игроку выбрать два значка. Если значки не совпадают, он скрывает два значка снова после короткого периода времени.

  1. Выберите вкладку панели элементов в категории компонентов, дважды щелкните или перетащите компонент таймера в форму. Значок таймера с именем таймер1отображается в пространстве под формой.

    снимок экрана: значок таймера под формой.

  2. Щелкните значок Таймер1, чтобы выбрать таймер. В окне "Свойства " нажмите кнопку "Свойства", чтобы просмотреть свойства.

  3. Задайте для свойства интервал значение 750, что составляет 750 миллисекунда.

    Свойство Interval сообщает таймеру, как долго ждать между тиков, когда он вызывает событие Tick. Программа вызывает метод Start(), чтобы запустить таймер после того, как проигрыватель выберет вторую метку.

  4. Выберите значок элемента управления таймером и нажмите клавишу ВВОДили дважды щелкните таймер. Интегрированная среда разработки добавляет пустой обработчик событий Tick в Form1.cs или Form1.vb. Замените код следующим кодом.

    /// <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 в C# и Nothing в Visual Basic.
  1. Перейдите в редактор кода и добавьте код в верхнюю и нижнюю часть метода обработчика событий label1_Click() в Form1.cs или Form1.vb. Этот код проверяет, включен ли таймер, задайте secondClicked ссылочной переменной и запустите таймер. Теперь метод обработчика событий label1_Click() выглядит следующим образом:

    /// <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 label1_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. Если игрок выбирает элементы управления первой и второй метки и начинается таймер, то выбор третьей метки ничего не изменит.
  • Код в нижней части метода присваивает ссылочной переменной secondClicked значение для отслеживания второго элемента управления типа Label. Затем он задает цвет значка метки черным, чтобы сделать его видимым. Затем он запускает таймер в однократном режиме, чтобы ожидать 750 миллисекунд, после чего произойдет один тик. Обработчик события "Tick" таймера скрывает два значка и сбрасывает ссылочные переменные firstClicked и secondClicked. Форма готова, чтобы игрок мог выбрать другую пару значков.

Заметка

Если вы копируете и вставляете блок кода label1_Click() вместо ввода кода вручную, обязательно замените существующий код label1_Click(). В противном случае вы в конечном итоге будете использовать повторяющийся блок кода.

  1. Сохраните и запустите программу. Выберите квадрат и значок становится видимым. Выберите еще один квадрат. Значок отображается кратко, а затем оба значка исчезают.

Теперь программа отслеживает первый и второй значки, которые вы выбираете. Он использует таймер для приостановки перед исчезновением значков.

Дальнейшие действия

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