Deine erste Platformer-Figur in Godot
Baue eine Figur, die läuft und springt, und ergänze die kleinen Tricks, mit denen sich Platformer gut anfühlen: variable Sprunghöhe, Beschleunigung und Coyote Time.

Quest-Ziele
- Eine Spieler-Szene mit CharacterBody2D aufsetzen
- Mit velocity und move_and_slide() laufen und springen
- Die Sprunghöhe von der Dauer des Tastendrucks abhängig machen
- Verspätete Sprünge mit Coyote Time verzeihen
Ein Platformer steht und fällt damit, wie sich die Spielfigur anfühlt. Die gute Nachricht: Dafür brauchst du erstaunlich wenig Code. In diesem Tutorial baust du eine Figur von Grund auf und verfeinerst sie dann mit drei kleinen Tricks, die fast jeder gute Platformer verwendet.
Die Szenen aufsetzen
Deine Figur bekommt eine eigene Szene, damit du sie später in jedes Level ziehen kannst.
Erstelle eine neue Szene mit einem CharacterBody2D als Wurzel und benenne ihn in
Playerum.Füge ein Sprite2D als Kind hinzu und ziehe
icon.svgaus dem Dateisystem-Dock auf dessen Texture-Eigenschaft.Füge eine CollisionShape2D als Kind hinzu, gib ihr eine neue RectangleShape2D und passe die Größe an das Sprite an.
Speichere die Szene als
player.tscn.
Erstelle jetzt eine zweite Szene für das Level. Nimm einen Node2D als Wurzel und füge einen StaticBody2D mit einer breiten CollisionShape2D als Boden hinzu. Ziehe player.tscn über dem Boden ins Level, speichere es als level.tscn und lege es als Hauptszene fest.
Laufen und springen
Wähle den Player-Node aus und hänge ein neues Skript namens player.gd an:
extends CharacterBody2D
@export var speed := 220.0
@export var jump_velocity := -380.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")
velocity.x = direction * speed
move_and_slide()In jedem Physik-Tick passieren drei Dinge:
In der Luft wirkt die Schwerkraft auf
velocity. Die Multiplikation mitdeltamacht das unabhängig von der Bildrate.Input.get_axis()liefert für die linke und rechte Taste einen Wert von -1 bis 1. Die eingebauten Aktionenui_left,ui_rightundui_acceptsind schon mit den Pfeiltasten und der Leertaste belegt, du musst also noch nichts einstellen.move_and_slide()bewegt den Körper um seinevelocity, löst Kollisionen auf und hältis_on_floor()aktuell. Die Reihenfolge ist wichtig: Der Aufruf gehört ans Ende.
In Godot zeigen negative Y-Werte nach oben, deshalb ist jump_velocity negativ. Drücke F5 und probiere es aus: Die Figur läuft und springt. Sie fühlt sich aber steif an, weil sie sofort startet und stoppt und jeder Sprung gleich hoch ist. Das ändern wir jetzt.
Mehr Gewicht durch Beschleunigung
Statt die Geschwindigkeit direkt zu setzen, bewegst du dich mit move_toward() in jedem Tick ein Stück darauf zu:
velocity.x = move_toward(velocity.x, direction * speed, acceleration * delta)Mit einer acceleration von 1600 erreicht die Figur ihre Höchstgeschwindigkeit in weniger als einer Sechstelsekunde. Das ist kurz genug, um direkt zu reagieren, und lang genug, um Gewicht zu vermitteln. Durch das Schlüsselwort @export erscheint der Wert im Inspektor, sodass du ihn bei laufendem Spiel anpassen kannst.
Variable Sprunghöhe
Spielerinnen und Spieler erwarten, dass ein kurzes Antippen einen kleinen Hüpfer ergibt. Wird die Taste losgelassen, während die Figur noch steigt, kürzt du die Geschwindigkeit nach oben:
if Input.is_action_just_released("ui_accept") and velocity.y < 0.0:
velocity.y *= 0.5Coyote Time
Dieser Trick ist nach einem gewissen Cartoon-Kojoten benannt: Die Figur kann noch einen Moment lang springen, nachdem sie über eine Kante gelaufen ist. Bewusst bemerkt das niemand, aber wenn es fehlt, fällt es sofort auf: Das Spiel hat scheinbar einen Tastendruck verschluckt.
Statt beim Springen is_on_floor() zu prüfen, führst du einen Timer, der sich am Boden auffüllt und in der Luft abläuft. Hier ist das fertige Skript mit allen drei Tricks:
extends CharacterBody2D
@export var speed := 220.0
@export var acceleration := 1600.0
@export var jump_velocity := -380.0
@export var coyote_time := 0.1
var coyote_left := 0.0
func _physics_process(delta: float) -> void:
if is_on_floor():
coyote_left = coyote_time
else:
coyote_left -= delta
velocity += get_gravity() * delta
if Input.is_action_just_pressed("ui_accept") and coyote_left > 0.0:
velocity.y = jump_velocity
coyote_left = 0.0
if Input.is_action_just_released("ui_accept") and velocity.y < 0.0:
velocity.y *= 0.5
var direction := Input.get_axis("ui_left", "ui_right")
velocity.x = move_toward(velocity.x, direction * speed, acceleration * delta)
move_and_slide()Wie es weitergeht
Du hast jetzt eine Figur, die sich gut steuern lässt. Als Nächstes könntest du eine Camera2D als Kind des Players hinzufügen oder den Boden durch einen TileMapLayer ersetzen, um ein richtiges Level zu bauen.