6단계: 타이머 추가Step 6: Add a timer

다음에는 일치 게임에 Timer 컨트롤을 추가합니다.Next, you add a Timer control to the matching game. 타이머는 지정한 시간(밀리초)을 대기한 뒤 이라고 하는 이벤트를 발생시킵니다.A timer waits a specified number of milliseconds, and then fires an event, referred to as a tick. 이 방법은 작업을 시작하거나 작업을 정기적으로 반복하는 데 유용합니다.This is useful for starting an action, or repeating an action on a regular basis. 이 경우 타이머를 사용하여 플레이어가 두 개의 아이콘을 선택할 수 있도록 하고 아이콘이 서로 일치하지 않을 경우 잠시 후 다시 두 개의 아이콘을 숨깁니다.In this case, you'll use a timer to enable players to choose two icons, and if the icons don't match, hide the two icons again after a short period of time.

타이머를 추가하려면To add a timer

  1. Windows Forms 디자이너의 도구 상자에서 구성 요소 범주의 Timer를 선택한 다음, Enter 키를 선택하거나 타이머를 두 번 클릭하여 타이머 컨트롤을 폼에 추가합니다.From the toolbox in Windows Forms Designer, choose Timer (in the Components category) and then choose the Enter key, or double-click the timer to add a timer control to the form. Timer1이라고 하는 타이머의 아이콘이 다음 그림과 같이 폼 아래 공간에 나타납니다.The timer's icon, called Timer1, should appear in a space below the form, as shown in the following picture.

    타이머 타이머Timer Timer

    참고

    도구 상자가 비어 있는 경우 도구 상자를 열기 전에 폼 뒤쪽의 코드가 아닌 폼 디자이너를 선택했는지 확인하십시오.If the toolbox is empty, be sure to select the form designer, and not the code behind the form, before opening the toolbox.

  2. Timer1 아이콘을 선택하여 타이머를 선택합니다.Choose the Timer1 icon to select the timer. 속성 창에서 이벤트 보기에서 속성 보기로 전환합니다.In the Properties window, switch from viewing events to viewing properties. 그런 다음 타이머의 Interval 속성은 750으로 설정하고 Enabled 속성은 False로 설정합니다.Then, set the timer's Interval property to 750, but leave its Enabled property set to False. Interval 속성은 타이머의 간 대기 시간이나 Tick 이벤트를 트리거하는 시점을 나타냅니다.The Interval property tells the timer how long to wait between ticks, or when it triggers its Tick event. 750이라는 값은 Tick 이벤트를 발생시키기 전에 타이머가 3/4초, 즉 750 밀리초를 대기함을 의미합니다.A value of 750 tells the timer to wait three quarters of a second (750 milliseconds) before it fires its Tick event. Start() 메서드를 호출하여 플레이어가 두 번째 레이블을 선택한 후에만 타이머가 시작되도록 합니다.You'll call the Start() method to start the timer only after the player chooses the second label.

  3. Windows Forms 디자이너에서 타이머 컨트롤 아이콘을 선택한 다음, Enter 키를 선택하거나, 타이머를 두 번 클릭하여 빈 Tick 이벤트 처리기를 추가합니다.Choose the timer control icon in Windows Forms Designer and then choose the Enter key, or double-click the timer, to add an empty Tick event handler. 또는 코드를 다음 코드로 바꾸거나 이벤트 처리기에 다음 코드를 수동으로 입력합니다.Either replace the code with the following code, or manually enter the following code into the event handler.

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

    Tick 이벤트 처리기는 다음 세 가지 작업을 수행합니다. 첫 번째로 타이머는 Stop() 메서드를 호출하면 실행이 중지됩니다.The Tick event handler does three things: First, it makes sure the timer isn't running by calling the Stop() method. 그런 다음 firstClickedsecondClicked라는 두 개의 참조 변수를 사용하여 플레이어가 선택한 두 레이블의 아이콘이 다시 보이지 않도록 합니다.Then it uses two reference variables, firstClicked and secondClicked, to make the icons of the two labels that the player chose invisible again. 마지막으로 firstClickedsecondClicked 참조 변수를 null(Visual C#의 경우)과 Nothing(Visual Basic의 경우)으로 다시 설정합니다.Finally, it resets the firstClicked and secondClicked reference variables to null in Visual C# and Nothing in Visual Basic. 이 단계는 프로그램 자체를 다시 설정하는 방식이기 때문에 중요합니다.This step is important because it's how the program resets itself. 이제 Label 컨트롤이 추적되고 있지 않으며 플레이어는 레이블을 다시 선택할 수 있습니다.Now it's not keeping track of any Label controls, and it's ready for the player to choose a label again.

    참고

    Timer 개체에는 타이머를 시작하는 Start() 메서드와 타이머를 중지하는 Stop() 메서드가 있습니다.A Timer object has a Start() method that starts the timer, and a Stop() method that stops it. 속성 창에서 타이머의 Enabled 속성을 True로 설정하면 프로그램이 시작되는 즉시 타이머에서 틱이 시작됩니다.When you set the timer's Enabled property to True in the Properties window, it starts ticking as soon as the program begins. 그러나 이 속성을 False로 설정하면 Start() 메서드가 호출될 때까지 틱을 시작하지 않습니다.But when you leave it set to False, it doesn't start ticking until its Start() method is called. 일반적으로 타이머는 틱 사이의 밀리초를 결정하는 Interval 속성을 사용하여 Tick 이벤트를 반복적으로 발생시킵니다.Normally, a timer fires its Tick event over and over again, using the Interval property to determine how many milliseconds to wait between ticks. 이 경우에 Tick 이벤트 내에서 타이머의 Stop() 메서드가 호출되는 방식을 살펴보면You may have noticed how the timer's Stop() method is called inside the Tick event. 타이머가 일회 모드로 설정되고, 그에 따라 Start() 메서드가 호출되면 지정한 간격만큼 기다렸다가 단일 Tick 이벤트를 트리거한 뒤 중지됩니다.That puts the timer into one shot mode, meaning that when the Start() method is called, it waits for the specified interval, triggers a single Tick event, and then stops.

  4. 새 타이머의 동작을 보려면 코드 편집기로 이동하여 다음 코드를 label_Click() 이벤트 처리기 메서드의 위쪽과 아래쪽에 추가합니다.To see the new timer in action, go to the code editor and add the following code to the top and bottom of the label_Click() event handler method. if 문을 위쪽에 추가하고 세 개의 문을 아래쪽에 추가하며 메서드의 나머지 부분은 그대로 유지됩니다.(You're adding an if statement to the top, and three statements to the bottom; the rest of the method stays the same.)

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

    메서드 위쪽의 코드는 Enabled 속성 값을 검사하여 타이머가 시작되었는지 여부를 확인합니다.The code at the top of the method checks whether the timer was started by checking the value of the Enabled property. 그러면 플레이어가 첫 번째 및 두 번째 Label 컨트롤을 선택하고 타이머가 시작되는 경우 세 번째 레이블을 선택해도 아무것도 수행되지 않습니다.That way, if the player chooses the first and second Label controls and the timer starts, choosing a third label won't do anything.

    메서드 아래쪽의 코드는 플레이어가 선택한 두 번째 Label 컨트롤을 추적하도록 secondClicked 참조 변수를 설정한 다음, 레이블의 아이콘 색을 검정으로 설정하여 표시합니다.The code at the bottom of the method sets the secondClicked reference variable to track the second Label control that the player chose, and then it sets that label's icon color to black to make it visible. 그런 다음 750밀리초 동안 기다린 후 단일 Tick 이벤트를 발생시키도록 일회 모드에서 타이머를 시작합니다.Then, it starts the timer in one shot mode, so that it waits 750 milliseconds and then fires a single Tick event. 그러면 타이머의 Tick 이벤트 처리기는 두 아이콘을 숨기고 firstClickedsecondClicked 참조 변수를 다시 설정하므로 폼에서 플레이어가 다른 아이콘 쌍을 선택할 수 있습니다.The timer's Tick event handler hides the two icons and resets the firstClicked and secondClicked reference variables so the form is ready for the player to choose another pair of icons.

  5. 프로그램을 저장하고 실행합니다.Save and run your program. 아이콘을 선택하면 표시됩니다.Choose an icon, and it becomes visible.

  6. 다른 아이콘을 선택합니다.Choose another icon. 그러면 해당 아이콘이 잠깐 나타났다가 두 아이콘이 모두 사라집니다.It appears briefly, and then both icons disappear. 이 작업을 여러 번 반복하십시오.Repeat this numerous times. 이제 폼에서 사용자가 선택하는 첫 번째 아이콘과 두 번째 아이콘을 추적하고, 아이콘이 사라지기 전에 타이머를 사용하여 일시 중지시킵니다.The form now keeps track of the first and second icons that you choose, and uses the timer to pause before making the icons disappear.

계속하거나 검토하려면To continue or review