Ga naar hoofdinhoud

Score op het scherm tonen

Je hebt nu Global.score die de hele speelsessie blijft bestaan. Tijd om hem zichtbaar te maken bovenaan het scherm โ€” met een Label.

Godot 4.5

Geschreven voor Godot 4.5.x โ€” zie Godot-versies voor compatibiliteit.

Voorspel: hoe vaak update je de tekst?โ€‹

Je wilt dat de tekst op het scherm verandert zodra Global.score verandert. Hoe vaak zou je de tekst opnieuw moeten zetten?

Antwoord

Het simpelst is om de tekst elke frame opnieuw te zetten. Dan staat hij altijd gelijk aan Global.score, ongeacht wanneer die wordt opgehoogd. Godot heeft daar een ingebouwde functie voor: _process(delta).

Stap 1: Voeg een Label toeโ€‹

  1. Open je level-scรจne (bijvoorbeeld world.tscn).
  2. Klik met rechts op de root-node โ†’ Add Child Node โ†’ zoek Label.
  3. Hernoem de Label naar ScoreLabel.
  4. Sleep de Label in de viewport naar de plek waar je hem wilt (bijvoorbeeld linksboven).
  5. Pas eventueel de tekstgrootte aan onder Theme Overrides โ†’ Font Sizes in de Inspector.

Stap 2: Voeg een script toe aan de Labelโ€‹

  1. Selecteer ScoreLabel.
  2. Klik op het script-icoontje of klik met rechts โ†’ Attach Script โ†’ Create.

Stap 3: _process(delta) โ€” elke frame bijwerkenโ€‹

Vervang de inhoud van het script door:

extends Label

func _process(delta: float) -> void:
text = "Score: " + str(Global.score)
CodeWat doet het?
_process(delta)Wordt elke frame uitgevoerd, ideaal om iets continu bij te werken
textDe tekst die de Label op het scherm toont
str(Global.score)Zet het getal om naar tekst zodat je het kunt plakken aan "Score: "

_process vs _physics_processโ€‹

Je hebt eerder _physics_process(delta) gebruikt in je karakter-script. Wat is het verschil?

FunctieWanneer gebruiken?
_physics_process(delta)Voor beweging, zwaartekracht, botsingen โ€” alles met physics
_process(delta)Voor algemene updates โ€” UI, timers, animatie-logica zonder physics

Voor een Label die alleen tekst toont is _process perfect.

Stap 4: Test hetโ€‹

Start het spel met F5 en pak een muntje op. De Label telt live mee.

Opdracht 6.4.a: een levens-Labelโ€‹

Je hebt nu een Score-Label. Doe hetzelfde voor Global.levens.

Voeg een tweede Label toe (LevensLabel) die Global.levens toont in rood.

Klik hier voor een tip.
  • Voeg een nieuwe Label toe aan je level-scรจne en hernoem naar LevensLabel.
  • Koppel een script met dezelfde structuur als ScoreLabel, maar verwijs naar Global.levens.
  • Voor de kleur: selecteer de Label en zoek in de Inspector naar Theme Overrides โ†’ Colors โ†’ Font Color โ€” zet die op rood.
Klik hier voor de oplossing.

Script op LevensLabel:

extends Label

func _process(delta: float) -> void:
text = "Levens: " + str(Global.levens)

Voor de rode kleur: Inspector โ†’ Theme Overrides โ†’ Colors โ†’ vink Font Color aan โ†’ kies rood.

Er gaat iets misโ€‹

Mijn Label blijft op "0" staan

Oorzaak: Het script werkt wel, maar Global.score wordt nergens opgehoogd โ€” bijvoorbeeld omdat je vergeten bent het muntje-script te updaten naar Global.score += 1.

Oplossing: Open je muntje-script en controleer dat er Global.score += 1 staat (niet body.score += 1 uit de vorige les).

Mijn Label toont niks, of de oude waarde uit de Inspector

Oorzaak: Het script is niet aan de juiste Label gekoppeld, of de Label staat buiten het zichtbare scherm.

Oplossing:

  1. Selecteer ScoreLabel โ€” bovenaan in de Inspector moet een script-icoontje staan.
  2. Controleer in de viewport dat de Label binnen het blauwe kader (schermgrens) staat.
  3. Zet bij Theme Overrides โ†’ Font Sizes een grotere waarde als de tekst te klein is.
Ik krijg Invalid call. Nonexistent function 'Str' in base 'int'

Oorzaak: GDScript is hoofdlettergevoelig. Str bestaat niet โ€” alleen str (kleine letter).

Oplossing: Vervang Str(...) door str(...).

Mijn score telt twee keer op per muntje

Oorzaak: Het body_entered-signal is per ongeluk twee keer gekoppeld aan dezelfde functie.

Oplossing: Zie Signals & een muntje oppakken โ†’ "Er gaat iets mis" โ†’ "signal already connected".