Etapa 6: Adicionar um temporizador
Em seguida, adicione um controle Timer ao jogo da memória.Um temporizador aguarda um número especificado de milissegundos e, em seguida, dispara um evento, conhecido como um tique.Isso é útil para iniciar uma ação, ou repetir uma ação, regularmente.Nesse caso, você usará um temporizador para permitir que os jogadores escolham dois ícones e, se os ícones não corresponderem, ocultar os dois ícones novamente após um curto período.
Para adicionar um temporizador
Na caixa de ferramentas do Designer de Formulários do Windows, escolha Temporizador (na categoria Componentes) e escolha a tecla ENTER ou clique duas vezes no temporizador para adicionar um controle de temporizador ao formulário.O ícone de temporizador, chamado Timer1, deve aparecer em um espaço abaixo do formulário, conforme mostrado na imagem a seguir.
Temporizador
Observação Se a caixa de ferramentas estiver vazia, você deve selecionar o designer de formulário, e não o código por trás do formulário, antes de abrir a caixa de ferramentas.
Escolha o ícone Timer1 para selecionar o temporizador.Na janela Propriedades, alterne do modo de exibição de eventos para o de propriedades.Em seguida, defina a propriedade Intervalo do temporizador para 750, mas deixe sua propriedade Habilitado definido como Falso.A propriedade Intervalo informa ao temporizador quanto tempo aguardar entre os tiques ou quando ele dispara seu evento Tick.Um valor de 750 informa ao temporizador para aguardar três quartos de um segundo (750 milissegundos) antes de disparar o evento Tick.Você chamará o método Start() para iniciar o temporizador apenas depois que o jogador escolher o segundo rótulo.
Escolha o ícone do controle de temporizador no Designer de Formulários do Windows e escolha a tecla ENTER, ou clique duas vezes no temporizador, para adicionar um manipulador de eventos Tick vazio.Substitua o código pelo código a seguir ou insira-o manualmente no manipulador 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; }
O manipulador de eventos Tick realiza três tarefas: primeiro, ele verifica se o temporizador não está em execução chamando o método Stop().Em seguida, ele usa duas variáveis de referência, firstClicked e secondClicked, para tornar invisíveis novamente os ícones dos dois rótulos que jogador escolheu.Por fim, ele redefine as variáveis de referência firstClicked e secondClicked para null no Visual C# e Nothing no Visual Basic.Essa etapa é importante porque é como o programa redefine a si próprio.Agora, ele não está acompanhando nenhum controle Label e está pronto para que o jogador escolha um rótulo novamente.
Observação Um objeto Timer tem um método Start() que inicia o temporizador e um método Stop() que o interrompe.Quando você define a propriedade Habilitado do temporizador para Verdadeiro na janela Propriedades, ele inicia o tique assim que o programa é iniciado.Mas quando você a deixa definida como Falso, ele não inicia o tique até que seu método Start() seja chamado.Normalmente, um temporizador dispara seu evento Tick várias vezes usando a propriedade Intervalo para determinar quantos milissegundos aguardar entre os tiques.Você deve ter percebido como o método Stop() do temporizador é chamado no evento Tick.Ele coloca o temporizador no modo monoestável, o que significa que quando o método Start() é chamado, ele aguarda o intervalo especificado, dispara um único evento Tick e é interrompido.
Para ver o novo temporizador em ação, vá para o editor de código e adicione o código a seguir no início e no fim do método do manipulador de eventos label_Click(). (Você está adicionando uma instrução if no início e três instruções no fim; o restante do método informa o mesmo.)
''' <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(); } }
O código no início do método verifica se o temporizador foi iniciado verificando o valor da propriedade Habilitado.Dessa forma, se o jogador escolher o primeiro e o segundo controle Label e o temporizador for iniciado, a escolha de um terceiro rótulo não terá nenhum efeito.
O código no fim do método define a variável de referência secondClicked para acompanhar o segundo controle Label que o jogador escolhe e, em seguida, define a cor do ícone desse rótulo para preto, tornando-o visível.Em seguida, ele inicia o temporizador no modo monoestável, de modo que ele aguarda 750 milissegundos e dispara um único evento Tick.O manipulador de eventos Tick do temporizador oculta os dois ícones e redefine as variáveis de referência firstClicked e secondClicked de modo que o formulário esteja pronto para o que o jogador escolha outro par de ícones.
Salve e execute seu programa.Escolha um ícone e ele se tornará visível.
Escolha outro ícone.Ele aparece rapidamente e, em seguida, ambos os ícones desaparecem.Repita isso várias vezes.O formulário agora acompanha o primeiro e o segundo ícone que você escolhe, além de usar o temporizador para pausar antes de fazer os ícones desaparecerem.
Para continuar ou revisar
Para ir para a próxima etapa do tutorial, consulte Etapa 7: Manter os pares visíveis.
Para retornar à etapa anterior do tutorial, consulte Etapa 5: Adicionar referências de rótulo.