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.
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โ
- Open je level-scรจne (bijvoorbeeld
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 (bijvoorbeeld linksboven).
- Pas eventueel de tekstgrootte aan onder Theme Overrides โ Font Sizes in de Inspector.
Stap 2: Voeg een script toe aan de Labelโ
- Selecteer
ScoreLabel. - 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)
| 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 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 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
Labeltoe aan je level-scรจne en 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.
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:
- Selecteer
ScoreLabelโ 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.
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".