Animaties in code
Je hebt nu drie animaties — idle, run en jump — maar ze spelen nog niet automatisch op het juiste moment. In deze les koppel je de animaties aan wat je karakter doet: op de grond rennen, in de lucht springen, of stilstaan.
Geschreven voor Godot 4.5.x — zie Godot-versies voor compatibiliteit.
Voorspel: welke informatie heb je nodig?
Welke vragen moet je script per frame beantwoorden om de juiste animatie te kiezen?
Antwoord
Drie vragen:
- Staat mijn karakter op de grond?
- Beweegt mijn karakter, en welke kant op?
- Staat mijn karakter stil?
Voor elk van deze drie maken we een variabele.
Stap 1: Variabelen voor de toestand
Plaats deze twee variabelen bovenaan je script (onder JUMP_VELOCITY, boven _physics_process):
var op_de_grond
var staat_stil
Hoe ziet je hele script er nu uit?
extends CharacterBody2D
const SPEED = 300.0 # gebruik jouw eigen waarde
const JUMP_VELOCITY = -800.0
var op_de_grond
var staat_stil
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()
Stap 2: op_de_grond invullen en de jump-animatie
Welke functie kun je gebruiken om te checken of je hoofdpersoon op de grond staat?
- Geef
op_de_grondde waarde van die functie. - Speel de
jump-animatie af als de hoofdpersoon niet op de grond staat.
Bekijk het antwoord
op_de_grond = is_on_floor()
if not op_de_grond:
$AnimatedSprite2D.play('jump')
move_and_slide()
Voeg dit toe vóór move_and_slide() in je _physics_process.
Stap 3: De idle-animatie als je stilstaat
velocity.x houdt de horizontale snelheid bij.
- Bij welke waarde staat je hoofdpersoon stil?
- Hoe zet je de
idle-animatie aan als hij stilstaat?
Bekijk het antwoord
velocity.x == 0 betekent stilstaan. Voeg de check toe boven je animatie-keten:
staat_stil = velocity.x == 0
op_de_grond = is_on_floor()
if not op_de_grond:
$AnimatedSprite2D.play('jump')
elif staat_stil:
$AnimatedSprite2D.play('idle')
move_and_slide()
Let op elif: de idle-animatie wordt alleen geprobeerd als jump níet aan is — anders zou je elke frame twee animaties tegelijk starten.
Stap 4: De run-animatie en spiegelen
- Bij welke waarde van
velocity.xloopt je hoofdpersoon naar links? En naar rechts? - Speel de
run-animatie af als hij niet stilstaat. - Met
$AnimatedSprite2D.flip_h = truespiegel je het plaatje (kijkt links). Metfalsekijkt hij weer rechts.
Bekijk het antwoord
extends CharacterBody2D
const SPEED = 300.0
const JUMP_VELOCITY = -800.0
var op_de_grond
var staat_stil
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)
staat_stil = velocity.x == 0
op_de_grond = is_on_floor()
if not op_de_grond:
$AnimatedSprite2D.play('jump')
elif staat_stil:
$AnimatedSprite2D.play('idle')
elif velocity.x > 0:
$AnimatedSprite2D.play('run')
$AnimatedSprite2D.flip_h = false
elif velocity.x < 0:
$AnimatedSprite2D.play('run')
$AnimatedSprite2D.flip_h = true
move_and_slide()
Er gaat iets mis
Mijn karakter speelt altijd de jump-animatie, ook op de grond
Oorzaak: De variabele op_de_grond wordt niet (op tijd) bijgewerkt. Daardoor blijft not op_de_grond waar.
Oplossing: Zorg dat op_de_grond = is_on_floor() boven je if/elif-keten staat — niet eronder en niet binnen een if-blok.
Mijn karakter kijkt de verkeerde kant op tijdens het rennen
Oorzaak: flip_h staat op de verkeerde waarde.
Oplossing: Onthoud:
flip_h = false→ karakter kijkt rechts (standaard).flip_h = true→ karakter kijkt links (gespiegeld).
Dus bij velocity.x < 0 (links bewegen): flip_h = true.
De idle-animatie start niet als ik stilsta
Oorzaak: Twee mogelijke oorzaken:
- De volgorde van je
if/elifis verkeerd:velocity.x > 0of< 0wordt eerder waar danstaat_stil. staat_stil = velocity.x == 0wordt nooit waar omdatmove_towardheel kleine waardes (0.0001) overlaat.
Oplossing:
- Controleer dat
elif staat_stil:staat tussenif not op_de_grond:enelif velocity.x > 0:. - Werk
staat_stilbij vlak voor je if-keten, niet helemaal bovenaan je script.