GDScript Tips
Handige tips en trucs voor GDScript. Klik op een onderwerp om het open te klappen.
Variabelen
Wat is het verschil tussen var en const?
varis een variabele die je kunt veranderenconstis een constante die nooit verandert
var score = 0 # Kan veranderen
const SPEED = 300.0 # Verandert nooit
Gebruik const voor waarden die altijd hetzelfde blijven, zoals snelheid of zwaartekracht. Schrijf ze in HOOFDLETTERS.
Wat betekent :=?
Met := laat je Godot het type automatisch bepalen op basis van de waarde die je toekent:
var richting := 0.0 # Godot weet: dit is een float
var naam := "Speler" # Godot weet: dit is een String
var direction := Input.get_axis("ui_left", "ui_right") # Godot weet: dit is een float
Je hoeft het type dan niet zelf op te schrijven.
Waar zet ik mijn variabelen neer?
Zet variabelen altijd bovenaan je script, na extends en na je constanten:
extends CharacterBody2D # 1. Extends
const SPEED = 300.0 # 2. Constanten
var score = 0 # 3. Variabelen
var op_de_grond = false
func _physics_process(delta): # 4. Functies
pass
Functies
Wat is _physics_process(delta)?
Dit is een speciale functie die Godot elk physics-frame aanroept (standaard 60 keer per seconde). Gebruik deze voor alles wat met beweging en fysica te maken heeft.
func _physics_process(delta: float) -> void:
velocity += get_gravity() * delta
move_and_slide()
delta is de tijd (in seconden) sinds het vorige frame. Dit zorgt ervoor dat je spel even snel draait op snelle en langzame computers.
Wat is het verschil tussen _process en _physics_process?
| Functie | Wanneer? | Gebruik voor |
|---|---|---|
_process(delta) | Elk frame (variabel) | UI updates, animaties, niet-fysica logica |
_physics_process(delta) | Elk physics-frame (vast, 60x/s) | Beweging, botsingen, fysica |
Vuistregel: Gebruik _physics_process als je move_and_slide() of velocity gebruikt.
Hoe maak ik een eigen functie?
func mijn_functie():
print("Hallo!")
func bereken_schade(aanval, verdediging):
var schade = aanval - verdediging
return schade
Aanroepen doe je zo:
mijn_functie()
var resultaat = bereken_schade(10, 3) # resultaat = 7
If-statements
Hoe werkt een if-statement?
if voorwaarde:
# Dit gebeurt als de voorwaarde waar is
elif andere_voorwaarde:
# Dit gebeurt als de eerste niet waar is, maar deze wel
else:
# Dit gebeurt als geen enkele voorwaarde waar is
Voorbeeld:
if score >= 100:
print("Je hebt gewonnen!")
elif score >= 50:
print("Bijna!")
else:
print("Blijf muntjes verzamelen!")
Hoe combineer ik meerdere voorwaarden?
Gebruik and en or:
# Beide moeten waar zijn
if is_on_floor() and Input.is_action_just_pressed("ui_accept"):
velocity.y = JUMP_VELOCITY
# Eén van de twee moet waar zijn
if velocity.x > 0 or velocity.x < 0:
$Sprite2D.play('Run')
Met not draai je een voorwaarde om:
if not is_on_floor():
$Sprite2D.play('Jump')
Input
Wat is het verschil tussen is_action_pressed en is_action_just_pressed?
| Functie | Wanneer true? | Gebruik voor |
|---|---|---|
is_action_pressed("ui_accept") | Zolang je de toets ingedrukt houdt | Bewegen, schieten (continu) |
is_action_just_pressed("ui_accept") | Alleen op het moment dat je de toets indrukt | Springen, menu openen (eenmalig) |
# Springen — alleen 1x per keer dat je drukt
if Input.is_action_just_pressed("ui_accept"):
velocity.y = JUMP_VELOCITY
# Bewegen — zolang je de toets vasthoudt
if Input.is_action_pressed("ui_right"):
velocity.x = SPEED
Wat doet Input.get_axis()?
get_axis() geeft een getal terug tussen -1 en 1:
var direction := Input.get_axis("ui_left", "ui_right")
# direction = -1 → links ingedrukt
# direction = 0 → niks ingedrukt
# direction = 1 → rechts ingedrukt
Dit is handig omdat je het direct kunt vermenigvuldigen met je snelheid:
velocity.x = direction * SPEED
Nodes & Scenes
Wat betekent het $-teken?
$ is een snelkoppeling om een child-node op te zoeken op naam:
$Sprite2D # Zoekt de child-node genaamd "Sprite2D"
$Sprite2D.play('Run') # Roept een functie aan op die node
$Sprite2D.flip_h # Leest een eigenschap van die node
$Sprite2D is hetzelfde als get_node("Sprite2D"), maar korter.
Let op: De naam moet exact overeenkomen met de naam in de scene tree (hoofdlettergevoelig!).
Wat doet queue_free()?
queue_free() verwijdert een node uit het spel. Het muntje, een vijand, een kogel — alles wat weg moet:
func _on_body_entered(body: Node2D) -> void:
queue_free() # Verwijdert DEZE node
De node wordt niet direct verwijderd, maar aan het einde van het huidige frame. Zo voorkom je crashes.
Signals
Hoe koppel ik een signal via de editor?
- Selecteer de node die het signal verstuurt (bijv.
Area2D) - Ga naar het Node tabblad (rechts naast de Inspector)
- Dubbelklik op het signal (bijv.
body_entered) - Kies de ontvangende node en klik op Connect
Godot maakt automatisch een functie aan:
func _on_body_entered(body: Node2D) -> void:
pass # Jouw code hier
Hoe koppel ik een signal via code?
func _ready():
body_entered.connect(_on_body_entered)
func _on_body_entered(body: Node2D) -> void:
print("Botsing!")
_ready() wordt één keer aangeroepen wanneer de node in de scene tree wordt geplaatst.
Debuggen
Hoe debug ik mijn code?
Gebruik print() om waarden naar de console te schrijven:
print("Hallo!") # Tekst
print(velocity) # Vector2 waarde
print("Score: ", score) # Tekst + variabele
print(is_on_floor()) # true of false
De output verschijnt in het Output paneel onderaan in Godot.
Hoe lees ik een foutmelding?
Een foutmelding in Godot ziet er zo uit:
res://scripts/player.gd:15 - Invalid call. Nonexistent function 'plya' in base 'AnimatedSprite2D'.
Lees het zo:
res://scripts/player.gd→ Het bestand waar de fout zit:15→ Op regel 15- De rest → Wat er mis is (in dit geval: de functie
plyabestaat niet — het moetplayzijn)
Veelgebruikte patronen
Compleet movement script
extends CharacterBody2D
const SPEED = 300.0
const JUMP_VELOCITY = -800.0
func _physics_process(delta: float) -> void:
if not is_on_floor():
velocity += get_gravity() * delta
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY
var direction := Input.get_axis("ui_left", "ui_right")
if direction:
velocity.x = direction * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
move_and_slide()
Compleet muntje script
extends Area2D
func _on_body_entered(body: Node2D) -> void:
Global.score += 1
print("Score: ", Global.score)
queue_free()
Compleet global script
extends Node
var score = 0
var levens = 3
func reset():
score = 0
levens = 3
Vergeet niet dit script als Autoload in te stellen via Project Settings!