Ga naar inhoud

Wavecounter

Doelstelling

Het doel van deze userstory was om het aantal waves dat de speler heeft overleefd te tonen op het scherm. Dit was nodig om de speler een visuele indicatie te geven hoe ver hij is in het spel.

Toegepaste oplossing

Als eerst heb ik een nieuwe system class gemaakt genaamd WaveCounter die de wavecounter bijhoudt. Deze class heeft 2 protected variabelen, state en game. State is een instance van de StateManager class en game is een instance van de GameState class.

    protected StateManager state;
    protected GameState game;
    private TextGameObject waveNumberText;
De WaveCounter class heeft ook een TextGameObject variabele genaamd waveNumberText. Deze variabele houdt de wavecounter bij en wordt getekend op het scherm. In de Initialize functie wordt de state variabele geinitialiseerd en wordt de waveNumberText geinitialiseerd.
    public override void Initialize(App app, SystemHandler handler)
    {
        base.Initialize(app, handler);

        state = handler.GetSystem<StateManager>();

        waveNumberText = new TextGameObject("Fonts/SpriteFont");
        waveNumberText.Text = waveNumber.ToString();
        waveNumberText.Position = new Vector2(390, 25);
        waveNumberText.Color = Color.White;

        handler
            .GetSystem<EventBus>()
            .Subscribe((WaveStartEvent e) => {
                waveNumberText.Text = e.waveNumber.ToString();
            });
    }

EventBus

De EventBus is een systeem die events afhandelt en doorstuurt naar de juiste systemen. In dit geval wordt er een event geabonneerd die de wavecounter bijhoudt. Als de event wordt getriggerd dan wordt de wavecounter geupdate. Dit zorgt ervoor dat de wavecounter altijd up-to-date is maar ook dat de wavecounter alleen wordt geupdate als de wavecounter wordt getriggerd.

In de LoadContent functie wordt de game variabele geinitialiseerd door de state te vragen naar de huidige state.

    public override void LoadContent()
    {
        game = state.GetState<GameState>();
    }

In de Draw functie wordt de waveNumberText getekend op het scherm, hij tekent alleen de wavecounter als de currentstat gelijk is aan Game. Als de huidige state niet gelijk is aan de game state dan wordt de waveNumberText niet getekend. In de EventBus wordt een event geabonneerd die de wavecounter bijhoudt. Als de event wordt getriggerd dan wordt de wavecounter geupdate.

    public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
    {
        if (state.currentState != game)
            return;

        waveNumberText.Draw(gameTime, spriteBatch);
    }

State check

Deze check is nodig om ervoor te zorgen dat de wavecounter niet in andere states wordt getekend, zoals de main menu of de pauze menu.

Bronnen


Laatst geüpdatet: June 9, 2024
Gecreëerd: June 4, 2024