Score op het scherm tonen
Je hebt nu Global.score die de hele speelsessie blijft bestaan. Tijd om de score zichtbaar te maken bovenaan het scherm — met een Label.
Predict
Je wilt dat de tekst op het scherm verandert zodra Global.score verandert. Hoe vaak zou je de tekst opnieuw moeten zetten?
Bekijk het 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
- Open je level-scene (bijv.
world.tscn) - Klik met rechts op de root-node → Add Child Node → zoek
Label - Hernoem de Label naar
ScoreLabel - Sleep de Label in de viewport naar de plek waar je hem wilt hebben (bijv. linksboven)
- Pas eventueel in de Inspector de tekstgrootte aan onder Theme Overrides → Font Sizes
Stap 2: Voeg een script toe aan de Label
- Selecteer de
ScoreLabel-node - Klik op het script-icoontje of klik met rechts → Attach Script
- Klik op Create
Stap 3: _process(delta) — elke frame de tekst bijwerken
Vervang de inhoud van het script door:
extends Label
func _process(delta: float) -> void:
text = "Score: " + str(Global.score)
| Code | Wat doet het? |
|---|---|
_process(delta) | Wordt elke frame uitgevoerd, ideaal om iets continu bij te werken |
text | De tekst die de Label op het scherm toont |
str(Global.score) | Zet het getal Global.score 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?
| Functie | Wanneer gebruiken? |
|---|---|
_physics_process(delta) | Voor beweging, zwaartekracht, botsingen — alles wat met physics te maken heeft |
_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 zou nu live moeten meetellen.
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:
- Selecteer de
ScoreLabel-node — bovenaan in de Inspector moet een script-icoontje staan - Controleer in de viewport dat de Label binnen het blauwe kader (schermgrens) staat
- Zet bij Theme Overrides → Font Sizes een grotere waarde als de tekst te klein is om te lezen
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".
Make-opdracht: een levens-Label
Je hebt nu een Score-Label. Doe hetzelfde voor Global.levens.
Opdracht: Voeg een tweede Label toe (LevensLabel) die Global.levens toont in rood.
Tip
- Voeg een nieuwe
Labeltoe aan je level-scene, hernoem naarLevensLabel - Koppel een script met dezelfde structuur als
ScoreLabel, maar verwijs naarGlobal.levens - Voor de kleur: selecteer de Label en zoek in de Inspector naar Theme Overrides → Colors → Font Color — zet die op rood
Antwoord
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.