Nachdem unsere Münzen nun schick animiert sind, ist der nächste logische Schritt, auch unseren Player zu animieren. Dadurch wird das Spielgeschehen noch dynamischer und die Aktionen unseres Charakters werden klarer visualisiert – z.B. eine „idle“-Animation, wenn er stillsteht, und eine „walk“-Animation, wenn er sich bewegt.
Dabei nutzen wir im Grunde dieselben AnimatedSprite2D
– und SpriteFrames–Konzepte wie bei der Münze, aber wir steuern die abgespielte Animation jetzt per Skript.
In diesem Artikel wirst du:
- Den
Sprite2D
unseres Players durch einenAnimatedSprite2D
ersetzen. - Mehrere Animationen (z.B. „idle“, „walk“) in einer SpriteFrames-Ressource erstellen.
- Lernen, wie man Sprite Sheets effizient importiert, um Animation-Frames zu erhalten.
- Das
player.gd
Skript erweitern, um die richtige Animation basierend auf der Bewegung des Players abzuspielen.
Schritt 1: Den Sprite2D durch AnimatedSprite2D ersetzen
Ähnlich wie bei der Münze tauschen wir den einfachen Sprite2D
-Node unseres Players gegen einen AnimatedSprite2D
aus.
- Öffne deine Szene
player.tscn
. - Wähle im Scene Dock den Sprite-Node (
Sprite2D
) aus, der aktuell ein Kind deines Player-Node (CharacterBody2D
) ist. - Klicke mit der rechten Maustaste auf den
Sprite2D
Node und wähle „Change Type“. - Suche im Suchfeld nach
AnimatedSprite2D
, wähle ihn aus und klicke „Change“. Benenne ihn um in „Animation„. - Dein
Sprite2D
wurde nun durch einenAnimatedSprite2D
ersetzt. Ein Warnsymbol zeigt an, dass noch keine Animationen definiert sind.
Schritt 2: Eine neue SpriteFrames-Ressource erstellen und Animationen hinzufügen
Wir brauchen wieder eine SpriteFrames-Ressource, um die Animationen für unseren Player zu definieren.
- Wähle im Scene Dock deinen Animation-Node (
AnimatedSprite2D
aus. - Gehe in den Inspector. Klappe den Abschnitt „Animation“ (innerhalb von
AnimatedSprite2D
) auf. - Du siehst dort die Eigenschaft „Sprite Frames“, die momentan „<empty>“ ist.
- Klicke auf das Dropdown-Menü neben „Sprite Frames“ und wähle „New SpriteFrames“.
- Eine neue SpriteFrames-Ressource wurde erstellt. Klicke auf das neu erschienene SpriteFrames-Symbol (da wo gerade noch <empty> stand).
- Unten im Editor öffnet sich der SpriteFrames-Editor. Dies ist der Bereich, in dem wir unsere Animationen erstellen und verwalten.
Sprite Sheets importieren
Die meisten Player-Animationen liegen als sogenannte Sprite Sheets vor – große Bilder, die alle Frames einer oder mehrerer Animationen enthalten. Du kannst z.B. eine Player-Animation als Sprite Sheet von itch.io verwenden. Lade sie herunter, entpacke das Zip-Archiv und füge die Dateien „Idle.png“ und „Walk.png“ dem File-System-Dock im Ordner „images“ hinzu.
Godot macht das Importieren von Frames aus Sprite Sheets sehr einfach:
- Im SpriteFrames-Editor (unten im Editor) siehst du eine Liste deiner Animationen (standardmäßig „default“). Diese benennen wir um in „idle“ (Leerlauf).
- Auf der rechten Seite, über dem Frame-Bereich, findest du den Button „Add Frames from Sprite Sheet“ (ein Gitter-Icon mit Plus). Klicke darauf.
- Wähle deine Sprite Sheet-Bilddatei aus (hier also „Idle.png“).
- Ein „Select Frames“-Fenster öffnet sich. Hier kannst du einstellen, wie Godot die Frames aus dem Bild „schneiden“ soll. Über „Auto Slice“ kann der Vorgang in der Regel gut abgekürzt werden. Klicke darauf und die Frames werden in Teile á 510 x 510 px geschnitten.
- Wähle nun alle BIlder von links nach rechts aus. Mit STRG + Mausrad kannst du zoomen, das macht die Auswahl einfacher.
- Nachdem du die Fames ausgewählt hast, klicke „Add 16 Frame(s)“. Die Frames werden der aktuell ausgewählten Animation („idle“) hinzugefügt.
Wenn du einzelne Frame-Bilder hast, kannst du sie auch einfach per Drag-and-Drop aus dem Filesystem Dock in den Frame-Bereich ziehen.
Neue Animationen erstellen
Für unseren Player werden wir zwei Animationen hinzufügen: „idle“ und „walk“.
- Falls noch nicht geschehen, füge die Animation für „idle“ wie oben beschrieben hinzu.
- Klicke auf den Button „Add Animation“ (das BLatt mit dem Plus-Icon) im SpriteFrames-Editor, um eine neue Animation zu erstellen. Benenne sie „walk“.
- Füge die Frames für die „walk“-Animation hinzu.
- Passe die „Speed (FPS)“ für jede Animation an, damit sie flüssig aussieht (bei 16 Bildern z.B. 16 FPS). Aktiviere „Looping“ für die „idle“-Animation, damit sie sich wiederholt.
- Stelle außerdem sicher, dass „Autoplay on Load“ für die „idle“-Animation aktiviert ist. Diese Einstellung findest du links neben dem „Looping„.
Schritt 3: Das Player-Script für Animationssteuerung erweitern
Jetzt geht es darum, die richtige Animation basierend auf der Bewegung unseres Players abzuspielen. Die Bewegungslogik wird in _physics_process(delta)
verarbeitet, und dort setzen wir auch die velocity
des Players. Die Entscheidung, welche Animation laufen soll, hängt direkt von dieser velocity
ab.
- Öffne dein
player.gd
Script (es sollte bereits an deinem Player (CharacterBody2D
) Node hängen). - Als Erstes brauchen wir eine Referenz auf unseren
AnimatedSprite2D
-Node im Skript. Füge diese Zeile ganz oben im Skript ein, am besten direkt nach denextends
undclass_name
-Deklarationen:
1 2 3 4 5 6 |
class_name Player extends CharacterBody2D @onready var animation = $Animation # Stelle sicher, dass $AnimatedSprite2D der korrekte Name deines AnimatedSprite2D Nodes ist var speed = 200 # Einheit: Pixel pro Sekunde # ... (restlicher Code) |
@onready var animated_sprite_2d = $Animation
: Dies ist eine bequeme Methode, um auf Kind-Nodes zuzugreifen. $AnimatedSprite2D
ist eine Kurzform für get_node("Animation")
. onready
stellt sicher, dass die Variable erst initialisiert wird, wenn der Node und seine Kinder in der Szene bereit sind.Wichtig: Der Name hinter dem $ muss genau der Bezeichnung im Node-Dock entsprechen.
- Navigiere zur Funktion
_physics_process(delta)
. Hier werden wir die Logik für die Animationen hinzufügen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# player.gd # ... # Called every frame (gut für visuelle Updates) func _process(delta): # rotation_degrees += 45 * delta # <<-- diese Zeile kann nun gelöscht werden pass func _physics_process(delta): # ... (Dein Bewegungs-Input Code zur Berechnung von 'direction') ... velocity = direction * speed move_and_slide() # Animationssteuerung var anim_name = "idle" # Standard-Animation ist "idle" if velocity.length() > 0.1: # Prüfe, ob sich der Player bewegt # Wenn der Player sich bewegt, spielen wir die "walk"-Animation. anim_name = "walk" # Da wir nur eine Animation "nach rechts" haben, spiegeln wir den Player ggf. if velocity.x > 0: animation.flip_h = false else: animation.flip_h = true # Spiele die entsprechende Animation, aber nur, wenn sie nicht bereits läuft if animation.animation != anim_name: animation.play(anim_name) |
Erklärung des Codes
velocity.length()
: Dervelocity
-Vektor hat eine Länge, die seiner Geschwindigkeit entspricht. Wenn der Player stillsteht, istvelocity
einVector2.ZERO
, undlength()
ist0
. Wenn er sich bewegt, istlength()
größer als0
. Wir verwenden einen kleinen Schwellenwert (0.1
), um sicherzustellen, dass wir nicht auf winzige, unmerkliche Bewegungen reagieren.animation: AnimatedSprite2D
: Dies ist die@onready
Variable, die eine Referenz auf deine Animation enthält.if velocity.x > 0: animation.flip_h = false
: Wenn der Spieler sich nach rechts bewegt (velocity_x
ist positiv), wollen wir, dass der Sprite normal aussieht, also setzen wirflip_h
auffalse
.else velocity_x < 0: animation.flip_h = true
: Wenn der Spieler sich nach links bewegt (velocity_x
ist negativ), wollen wir, dass der Sprite gespiegelt wird, also setzen wirflip_h
auftrue
.animation.animation != anim_name
: Diese Prüfung ist wichtig! Sie verhindert, dass wir dieplay()
-Methode in jedem einzelnen Frame aufrufen, wenn die gewünschte Animation bereits läuft.
Schritt 4: Speichern und Ausführen
- Speichere dein
player.gd
Skript (Strg + S). - Stelle sicher, dass deine
player.tscn
undcoin.tscn
ebenfalls gespeichert sind. - Führe dein Projekt aus (F5).
Jetzt sollte sich dein Player:in bewegen und zwischen „idle“- und „run“-Animationen wechseln, je nachdem, ob er sich bewegt oder stillsteht! Wenn du separate Richtungsanimationen hinzugefügt hast, wird er sogar in die entsprechende Richtung „laufen“.
Dein nächster Schritt
Sieht doch gut aus! Du hast gelernt, wie man AnimatedSprite2D
nutzt, um komplexe Animationen per Skript zu steuern. Das gibt deinem Spiel sofort viel mehr visuelles Feedback und Tiefe.
Als Nächstes ergänzen wir Animationen und Soundeffekte, die abgespielt werden, wenn der Spieler eine Münze einsammelt.