Ga naar hoofdinhoud

Het bewegingsscript bouwen — Deel 2: Vallen

Je functie draait, maar je karakter staat stil. In deze les geef je hem snelheid, zodat hij valt.

Godot 4.7

Geschreven voor Godot 4.7.x — zie Godot-versies voor compatibiliteit.

Wat je nu gaat toevoegen

Eén regel, met twee nieuwe begrippen: velocity en +=. Na deze les valt je karakter naar beneden.

Voorspel: waar bewaart Godot de snelheid?

move_and_slide() verplaatst je karakter op basis van zijn snelheid. Waar denk je dat die snelheid staat — moet je hem zelf aanmaken, of bestaat hij al?

Antwoord

Hij bestaat al. Elke CharacterBody2D heeft een eigenschap velocity, en door extends CharacterBody2D is die van jou. Je hoeft hem niet aan te maken; je hoeft hem alleen te veranderen.

Zulke kant-en-klare eigenschappen van een node heten member variables.

Stap 1: Snelheid opbouwen

Zet deze regel boven move_and_slide(), binnen de functie:

func _physics_process(delta: float) -> void:
velocity += get_gravity() * delta

move_and_slide()

get_gravity() geeft de zwaartekracht van je project terug, standaard (0, 980). Dat is geen snelheid maar een versnelling: elke seconde komt er 980 bij je snelheid.

Het stukje * delta laat je even voor wat het is — dat is Deel 3.

Stap 2: Wat velocity is

velocity is de snelheid van je karakter: een X en een Y in één waarde. Zet tijdelijk print(velocity) boven move_and_slide() en kijk in Uitvoer terwijl je speelt:

(0, 16.33)
(0, 32.67)
(0, 49)

De X blijft 0, want je beweegt niet zijwaarts. De Y wordt elke frame 16.33 groter: dat is die 980 verdeeld over zestig frames. Steeds hetzelfde stukje erbij, en juist daardoor val je steeds sneller.

Je kunt .x en .y los aanspreken, bijvoorbeeld velocity.y = 0. Dat gebruik je vanaf Deel 5.

Stap 3: Waarom += en niet =

velocity += iets is de korte schrijfwijze van velocity = velocity + iets. De zwaartekracht wordt dus opgeteld bij de snelheid die er al was, frame na frame. Zo bouwt valsnelheid zich op: na één seconde val je hard, na twee seconden harder.

Wat zou er gebeuren als je += vervangt door =?

Antwoord

Je karakter zakt met een constante, hele lage snelheid naar beneden in plaats van versneld. Elke frame zet je velocity dan terug op één klein stapje, in plaats van het op te bouwen. Het voelt als zweven, niet als vallen.

Stap 4: Test het

Start met F5 en zet je karakter in de editor boven de grond, of loop van een platform af.

Hij valt en blijft op de vloer liggen. Besturing komt vanaf Deel 5.

pas op

Let op de volgorde: move_and_slide() blijft de laatste regel in de functie. Eerst reken je de snelheid uit, dan pas laat je Godot verplaatsen. Andersom loopt alles één frame achter.

Je script tot nu toe

Klik hier om te vergelijken
extends CharacterBody2D

func _physics_process(delta: float) -> void:
velocity += get_gravity() * delta

move_and_slide()

Er gaat iets mis

Mijn karakter valt door de vloer heen

Oorzaak: De vloer heeft geen collision, of je karakter heeft geen CollisionShape2D.

Oplossing:

  1. Controleer of je tegels een Physics Layer hebben (Collision op je tegels).
  2. Controleer of je CharacterBody2D een CollisionShape2D als child heeft, mét een Shape ingesteld.
Mijn karakter valt niet, hij blijft zweven

Oorzaak: De regel staat op het verkeerde inspringniveau, of move_and_slide() ontbreekt.

Oplossing: De regel met velocity hoort één niveau in te springen, binnen de functie. En move_and_slide() blijft als laatste regel staan.

Zelf vinden: zet print(velocity) boven move_and_slide(). Blijft daar (0, 0) staan, dan wordt je valregel niet uitgevoerd. Verandert velocity wél maar beweegt er niets, dan ligt het bij move_and_slide().

Foutmelding: Identifier "velocity" not declared in the current scope

Oorzaak: De eerste regel van je script klopt niet. velocity bestaat alleen als je script van een CharacterBody2D erft.

Oplossing: Controleer dat er bovenaan extends CharacterBody2D staat.


Deel 1 — Een script dat draait · Volgende: Deel 3 — Delta