Delen via


Handleiding: Referentievariabelen en een timercontrole toevoegen aan uw overeenkomende WinForms-app

In deze reeks van vier zelfstudies bouwt u een overeenkomend spel, waarbij de speler paren verborgen pictogrammen matcht.

Uw Matching Game-programma moet bijhouden welke Label-besturingselementen de speler kiest. Nadat een speler het eerste label heeft gekozen, moet het programma het pictogram weergeven. Nadat het tweede label is gekozen, moet het programma beide pictogrammen gedurende een korte tijd weergeven. Vervolgens worden beide pictogrammen verborgen.

In uw programma wordt bijgehouden welk label u als eerste en tweede kiest met behulp van referentievariabelen. Een timer verbergt de pictogrammen en bepaalt hoe lang de pictogrammen moeten worden weergegeven

  • Voeg labelverwijzingen toe.
  • Voeg een timer toe.

Voorwaarden

Deze zelfstudie bouwt voort op eerdere zelfstudies, Een overeenkomende gametoepassing maken en Pictogrammen toevoegen aan uw overeenkomende game. Voltooi deze zelfstudies eerst.

Labelverwijzingen toevoegen

In deze sectie voegt u twee verwijzingsvariabelen toe aan uw code. Ze houden labels bij of verwijzen naar labelobjecten.

  1. Voeg labelverwijzingen toe aan uw formulier met behulp van de volgende code in Form1.cs of 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;
    

Als u C# gebruikt, plaatst u de code na de openingsaccolade en direct na de klassedeclaratie (public partial class Form1 : Form). Als u Visual Basic gebruikt, plaatst u de code direct na de klassedeclaratie (Public Class Form1).

Deze uitdrukkingen zorgen er niet voor dat labelbesturingselementen op het formulier worden weergegeven, omdat het new trefwoord ontbreekt. Wanneer het programma wordt gestart, worden zowel firstClicked als secondClicked ingesteld op null voor C# of Nothing voor Visual Basic.

  1. Wijzig de Click gebeurtenis-handler in Form1.cs of Form1.vb om de nieuwe firstClicked referentievariabele te gebruiken. Verwijder de laatste instructie in de label1_Click() gebeurtenis-handlermethode (clickedLabel.ForeColor = Color.Black;) en vervang deze als volgt door de if-instructie.

    /// <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. Sla uw programma op en voer het uit. Kies een van de labelbesturingselementen en het bijbehorende pictogram wordt weergegeven. Kies het volgende labelcontrole en merk op dat er niets gebeurt.

    Schermopname toont de overeenkomende game met één pictogram.

    Alleen het eerste pictogram dat is gekozen, wordt weergegeven. De andere pictogrammen zijn onzichtbaar.

Het programma houdt al het eerste label bij dat de speler heeft gekozen. De verwijzing firstClicked is niet null in C# of Nothing in Visual Basic. Wanneer uw if instructie vaststelt dat firstClicked niet gelijk is aan null of Nothing, worden de instructies uitgevoerd.

Een timer toevoegen

De Matching Game-app maakt gebruik van een Timer besturingselement. Een timer wacht en vuurt vervolgens een gebeurtenis af, aangeduid als een tick. Een timer kan een actie starten of een actie regelmatig herhalen.

Met de timer in uw programma kan een speler twee pictogrammen kiezen. Als de pictogrammen niet overeenkomen, worden de twee pictogrammen na een korte periode weer verborgen.

  1. Selecteer het tabblad Werkset in de categorie Onderdelen op het Timer-onderdeel naar het formulier. Het timerpictogram, timer1genoemd, wordt weergegeven in een spatie onder het formulier.

    Schermopname toont het timerpictogram onder het formulier.

  2. Selecteer het pictogram Timer1 om de timer te selecteren. Selecteer in het venster Eigenschappen de knop Eigenschappen om eigenschappen weer te geven.

  3. Stel de eigenschap Interval in op 750, wat 750 milliseconden is.

    De eigenschap Interval vertelt de timer hoe lang moet worden gewacht tussen tikken, wanneer deze de Tick gebeurtenis activeert. Uw programma roept de Start() methode aan om de timer te starten nadat de speler het tweede label heeft gekozen.

  4. Kies het pictogram van het timerbesturingselement en druk vervolgens op Enterof dubbelklik op de timer. De IDE voegt een lege Tick-gebeurtenis-handler toe aan Form1.cs of Form1.vb. Vervang de code door de volgende code.

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

De Tick-evenementhandler voert drie handelingen uit.

  • Het zorgt ervoor dat de timer niet actief is door de Stop()-methode aan te roepen.
  • Er worden twee referentievariabelen gebruikt, firstClicked en secondClicked, om de pictogrammen van de twee door de speler gekozen labels weer onzichtbaar te maken.
  • Hiermee worden de firstClicked en secondClicked referentievariabelen opnieuw ingesteld op null in C# en Nothing in Visual Basic.
  1. Ga naar de code-editor en voeg code toe aan de boven- en onderkant van de event-handler methode label1_Click() in Form1.cs of Form1.vb. Met deze code wordt gecontroleerd of de timer is ingeschakeld, de secondClicked referentievariabele is ingesteld en de timer wordt gestart. De label1_Click() event-handler methode ziet er als volgt uit:

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

  • De code boven aan de methode controleert of de timer is gestart door de waarde van de eigenschap Ingeschakeld te controleren. Als de speler de eerste en tweede labelbesturingselementen kiest en de timer wordt gestart, zal het kiezen van een derde label niets doen.
  • Met de code onder aan de methode wordt de secondClicked verwijzingsvariabele ingesteld om het tweede label-besturingselement bij te houden. Vervolgens wordt de kleur van het labelpictogram ingesteld op zwart om deze zichtbaar te maken. Vervolgens wordt de timer gestart in eenmalige modus, zodat deze 750 milliseconden wacht en vervolgens een enkel tik afvuurt. De tick-gebeurtenishandler van de timer verbergt de twee pictogrammen en stelt de firstClicked en secondClicked referentievariabelen opnieuw in. Het formulier is klaar voor de speler om een ander paar pictogrammen te kiezen.

Notitie

Als u het label1_Click() codeblok kopieert en plakt in plaats van de code handmatig in te voeren, moet u de bestaande label1_Click() code vervangen. Anders krijgt u een duplicaatcodeblok.

  1. Sla uw programma op en voer het uit. Selecteer een vierkant en het pictogram wordt zichtbaar. Kies een ander vierkant. Het pictogram wordt kort weergegeven en vervolgens verdwijnen beide pictogrammen.

Uw programma houdt nu de eerste en tweede pictogrammen bij die u kiest. De timer wordt gebruikt om te onderbreken voordat de pictogrammen verdwijnen.

Volgende stappen

Ga verder met de volgende tutorial om te leren hoe je je Matching Game voltooit.