Een tweede level toevoegen
Tijd om je spel uit te breiden. In deze les maak je een tweede level en zorg je dat de speler automatisch overschakelt zodra hij het einde van het eerste level bereikt.
Geschreven voor Godot 4.5.x — zie Godot-versies voor compatibiliteit.
Voorspel: hoe laad je een ander level?
Stel je hebt twee level-scènes: level1.tscn en level2.tscn. Hoe denk je dat je in code zegt: "Stop met level 1 en start level 2"?
Antwoord
In Godot doe je dat met één regel:
get_tree().change_scene_to_file("res://level2.tscn")
get_tree()geeft je toegang tot de SceneTree, het systeem dat al je scènes beheert.change_scene_to_file()laadt een andere scène en vervangt de huidige.res://is het projectpad — alles wat in jouw projectmap zit, bereik je viares://gevolgd door de bestandsnaam.
Stap 1: Maak level2.tscn
- Klik op Scene → New Scene en kies 2D Scene. Godot maakt een
Node2Dals root. - Bouw een nieuw level op zoals je in Level tekenen met een TileMap en Collision op je tegels hebt geleerd. Maak hem iets anders dan level 1 — bijvoorbeeld een hogere uitdaging of een ander decor.
- Voeg een speler toe (sleep
karakter.tscnvanuit het FileSystem, óf bouw deCharacterBody2D-structuur opnieuw op zoals in Een speelbaar karakter). - Sla op via
Ctrl + Salslevel2.tscn.
Zorg dat je level 1-bestand level1.tscn heet (of pas later het pad in je script aan). Sla world.tscn eventueel opnieuw op als level1.tscn voor duidelijkheid.
Stap 2: Voeg een vlag toe aan level 1
Aan het einde van level 1 plaats je een "vlag" die de overgang triggert. De opzet lijkt op het muntje uit Signals & een muntje oppakken.
- Open
level1.tscn. - Klik met rechts op de hoofd-node → Add Child Node →
Area2D. - Hernoem de
Area2DnaarVlag. - Voeg eronder een
Sprite2Dtoe en sleep een vlag- of deur-afbeelding naar Texture. - Voeg ook een
CollisionShape2Dtoe met eenRectangleShape2D(ofCircleShape2D). - Plaats de
Vlagop de plek waar het level eindigt.
Je Scene Tree ziet er nu zo uit:
Level1 (Node2D)
├── ...
└── Vlag (Area2D)
├── Sprite2D
└── CollisionShape2D
Stap 3: Koppel het body_entered-signaal
- Selecteer de
Vlag-node. - Klik op het script-icoontje of klik met rechts → Attach Script → Create. Sla op als
vlag.gd. - Ga naar het Node-tabblad rechts naast de Inspector.
- Dubbelklik op
body_entered, kies deVlag-node als ontvanger en klik op Connect.
Godot voegt deze functie toe aan je script:
func _on_body_entered(body: Node2D) -> void:
pass # hier komt je code
Stap 4: Vervang pass door de scene-switch
extends Area2D
func _on_body_entered(body: Node2D) -> void:
get_tree().change_scene_to_file("res://level2.tscn")
| Code | Wat doet het? |
|---|---|
get_tree() | Geeft toegang tot het SceneTree-systeem |
change_scene_to_file("res://level2.tscn") | Vervangt de huidige scène door level2.tscn |
res:// | Verwijst naar je projectmap — level2.tscn zit in de hoofdmap |
Heb je level2.tscn in een submap opgeslagen? Pas het pad dan aan: res://levels/level2.tscn voor een bestand in een levels-map.
Stap 5: Test
Start het spel met F5 vanaf level 1. Loop je speler naar de vlag — zodra je hem raakt, opent level 2.
Je Global.score blijft staan tijdens de overgang (dankzij Global variables). Wil je per level opnieuw beginnen? Roep Global.reset() aan in _on_body_entered vóór de scene-switch.
Opdracht 7.1.a: voeg een derde level toe
Je hebt nu twee levels en kunt switchen. Breid uit: maak een derde level en zorg dat de speler vanuit level 2 daarheen gaat.
Klik hier voor een tip.
- Maak
level3.tscnop dezelfde manier als level 2. - Voeg ook in level 2 een
Vlag-node toe met dezelfde structuur. - Verbind het
body_entered-signaal en laadres://level3.tscn.
Bonus: voeg op level 3 een vlag toe die teruggaat naar level 1 — dan kan je speler eindeloos rondlopen.
Klik hier voor de oplossing.
Stappen:
- Maak
level3.tscn(Scene → New Scene → 2D Scene → bouw met tegels). - Open
level2.tscnen voeg eenVlag (Area2D)metSprite2D+CollisionShape2Dtoe. - Koppel een script en het
body_entered-signaal. - Vul de callback:
extends Area2D
func _on_body_entered(body: Node2D) -> void:
get_tree().change_scene_to_file("res://level3.tscn")
- (Bonus) Doe in level 3 hetzelfde, maar dan naar
res://level1.tscn.
Er gaat iets mis
Mijn spel crasht met "Cannot open file 'res://level2.tscn'"
Oorzaak: Het pad in je script komt niet overeen met de werkelijke bestandsnaam of -locatie.
Oplossing:
- Open het FileSystem-paneel linksonder en zoek
level2.tscn. - Klik met rechts op het bestand → Copy Path. Plak dat exact in je script.
- Let op hoofdletters:
Level2.tscnis niet hetzelfde alslevel2.tscn.
Mijn speler verdwijnt na de overgang
Oorzaak: level2.tscn bevat geen CharacterBody2D — elke scène heeft zijn eigen nodes, de speler uit level 1 verdwijnt mee.
Oplossing: Voeg in level2.tscn zelf een speler toe (zoals in Stap 1 punt 3). Geavanceerder is om de speler als Autoload te draaien zodat hij blijft bestaan over scènes heen — maar dat valt buiten deze les.
Mijn level switcht niet bij contact
Oorzaak: Het signaal is niet (correct) gekoppeld, of de speler heeft geen CollisionShape2D.
Oplossing:
- Selecteer de
Vlagen open het Node-tabblad. Staat er een groen pijltje bijbody_entered? - Heeft de speler een
CollisionShape2Dmet een Shape ingesteld? - Heeft de
Vlagzelf ook eenCollisionShape2Dmet Shape?