Paso 6: Agregar un temporizador
A continuación, agregará un control Timer al juego de formar parejas.Un temporizador espera un número especificado de milisegundos para desencadenar un evento conocido como tick.Esto es útil para iniciar o repetir una acción de forma periódica.En este caso, se usará un temporizador para permitir a los participantes elegir dos iconos y, si no coinciden, ocultarlos de nuevo trascurrido un breve período de tiempo.
Para agregar un temporizador
En el cuadro de herramientas del Diseñador de Windows Forms, elija Timer (en la categoría Componentes) y, a continuación, la tecla Entrar o haga doble clic en el temporizador para agregar un control timer al formulario.El icono del temporizador, denominado Timer1, debe aparecer en un espacio bajo del formulario, como se muestra en la siguiente imagen.
Temporizador
[!NOTA]
Si el cuadro de herramientas está vacío, asegúrese de seleccionar el diseñador de formularios, y no el código subyacente del formulario, antes de abrir el cuadro de herramientas.
Elija el icono Timer1 para seleccionar el temporizador.En la ventana Propiedades, cambie de la vista de eventos a la de propiedades.Después, establezca la propiedad Interval del temporizador en 750, pero deje la propiedad Enabled establecida en False.La propiedad Interval indica al temporizador cuánto tiempo debe esperar entre los pasos o cuando se desencadena el evento tick.Un valor de 750 indica al temporizador que espere tres cuartos de segundo (750 milisegundos) antes de desencadenar el evento Tick.Llame al método Start() para iniciar el temporizador únicamente después de que el jugador elija la segunda etiqueta.
Elija el icono del control de temporizador en el Diseñador de Windows Forms y elija la tecla ENTRAR, o haga doble clic en el temporizador, para agregar un controlador de eventos Tick vacío.Reemplace el código por el código siguiente o escriba manualmente el código siguiente en el controlador de eventos.
''' <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; }
El controlador de eventos Tick realiza tres acciones: primero, se asegura de que el temporizador no está en marcha mediante una llamada al método Stop().A continuación, usa las dos variables de referencia, firstClicked y secondClicked, para ocultar de nuevo los iconos de las dos etiquetas que el jugador eligió.Finalmente, restablece las variables de referencia firstClicked y secondClicked en null en Visual C# y Nothing en Visual Basic.Este paso es importante porque es como se restablece el programa.Ahora no realiza el seguimiento de ningún control Label y vuelve a estar listo para que el jugador elija otra etiqueta.
[!NOTA]
Un objeto Timer tiene un método Start() que inicia el temporizador y un método Stop() que lo detiene.Al establecer la propiedad Enabled del temporizador en True en la ventana Propiedades, inicia los pasos nada más comenzar el programa.Sin embargo, si se deja establecido en False, no inicia los pasos hasta que se llama a su método Start().Normalmente, un temporizador desencadena su evento Tick una y otra vez utilizando la propiedad Interval para determinar cuántos milisegundos debe esperar entre los pasos.Es posible que haya observado cómo se llama al método Stop() del temporizador dentro del evento Tick.Esto hace que el temporizador entre en modo de un disparo, lo que significa que, cuando se llama al método Start(), espera el intervalo especificado, desencadena un único evento Tick y después se para.
Para ver el nuevo temporizador en acción, vaya al editor de código y agregue el siguiente código al principio y al final del método de control de eventos label_Click(). (Se agrega una instrucción if al principio y tres instrucciones al final; el resto del método no cambia).
''' <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(); } }
El código que se encuentra al principio del método comprueba si el temporizador se inició comprobando el valor de la propiedad Enabled.Así, si el jugador elige el primer y segundo control Label y se inicia el temporizador, no sucederá nada al elegir un tercer control.
El código al final del método establece la variable de referencia secondClicked para que haga el seguimiento del segundo control Label que el jugador eligió y después establece el color del icono de esa etiqueta en negro para que sea visible.A continuación, inicia el temporizador en modo de un disparo de forma que espera durante 750 milisegundos antes de desencadenar un único evento Tick.Es entonces cuando el controlador de eventos Tick del temporizador oculta los dos iconos y restablece las variables de referencia firstClicked y secondClicked para que el formulario esté listo cuando el jugador elija otro par de iconos.
Guarde y ejecute el programa.Elija un icono y se hará visible.
Elija otro icono.Aparece brevemente y, a continuación, ambos iconos desaparecen.Repita el proceso varias veces.Ahora, el formulario realiza el seguimiento del primer y segundo icono que ha elegido y usa el temporizador para crear una pausa antes de hacer que los iconos desaparezcan.
Para continuar o revisar
Para ir al siguiente paso del tutorial, vea Paso 7: Mantener visibles los pares.
Para volver al paso anterior del tutorial, vea Paso 5: Agregar referencias a etiquetas.