HUD und Punktanzeige

Unser Spiel bietet bereits Bewegung, Kollisionen, Animationen, Soundeffekte und Partikel. Nun integrieren wir ein Heads-Up Display (HUD), um unseren Spieler:innen den aktuellen Punktestand anzuzeigen. Wir erstellen eine eigene Scene für das UI. Das ist Best Practice in Godot für modulare und übersichtliche Projekte. Auf diese Weise können wir die UI für mehrere Levels einfach wiederverwenden.

In diesem Artikel wirst du:

  • Eine neue, separate Scene für unser UI erstellen.
  • Einen CanvasLayer Node als Root dieser UI-Scene verwenden.
  • Einen Label Node für die Punktezahl hinzufügen und konfigurieren.
  • Ein Signal in unserem Player-Script deklarieren, das den neuen Punktestand aussendet.
  • Ein neues Script für die HUD-Scene erstellen, das auf dieses Signal hört.
  • Die UI-Scene in unsere World-Scene instanziieren und dort die Verbindung zwischen dem Player-Signal und dem HUD-Script herstellen.

Schritt 1: Eine neue Scene für das UI erstellen (hud.tscn)

Für UI-Elemente verwendet man in Godot Nodes, die von der Basisklasse Control erben. Um diese UI-Elemente über der Spielwelt (funktioniert sowohl in 2D als auch in 3D) anzuzeigen und sicherzustellen, dass sie sich nicht mit der Spielkamera mitbewegen, verwenden wir üblicherweise einen CanvasLayer. Ein CanvasLayer ist wie eine separate Zeichenebene, die immer über der Standard-Ebene liegt.

  1. Erstelle eine neue Scene: Gehe im Menü auf Scene -> New Scene (Strg + N).
  2. Wähle CanvasLayer als Root Node: Klicke auf „Other Node“, suche und wähle CanvasLayer. Klicke „Create“. Benenne diesen Root Node im Scene Dock in HUD um.
  3. Füge einen Label Node hinzu: Wähle im Scene Dock den HUD (CanvasLayer) Node aus. Klicke auf den „+“ Button (Child Node hinzufügen). Suche und wähle Label. Klicke „Create“. Benenne diesen Label in ScoreLabel um.
  4. Konfiguriere den ScoreLabel:
    • Wähle den ScoreLabel Node im Scene Dock aus.
    • Gehe in den Inspector.
    • Suche die Eigenschaft „Text“ und gib einen Startwert ein, z.B.: Score: 0.
    • Im Abschnitt „Control“:
      • Finde die Eigenschaft „Layout“ und klappe sie auf. Wähle im Bereich Anchors Preset die Option „Top Left“ (oben links).
      • Finde den Abschnitt „Theme Overrides“ und darin „Font Sizes“. Setze die font_size auf etwas Größeres. Probiere ein wenig aus, bis du mit der Größe zufrieden bist (z.B. 24). Das Ergebnis dieser Einstellung kannst du direkt im Viewport sehen.
  5. Speichere die UI-Scene: Gehe im Menü auf Scene -> Save Scene (Strg + S) im Ordner scenes. Nenne sie hud.tscn und speichere sie am besten im Projekt-Root oder in einem dedizierten ui-Ordner.

Schritt 2: Script für die HUD-Scene erstellen (hud.gd)

Damit unser HUD auf die Punktestandsänderungen reagieren kann, geben wir ihm ein eigenes Script. Dieses Script ist für die Aktualisierung des ScoreLabel verantwortlich.

  1. Script an HUD-Scene anhängen:
    • Öffne deine Szene hud.tscn.
    • Wähle im Scene Dock den Root Node HUD (CanvasLayer) aus.
    • Klicke auf den „Attach Script“ Button (Pergamentrolle mit Plus) oberhalb des Scene Trees.
    • Als „Base Type“ sollte CanvasLayer stehen, und der Pfad hud.gd vorschlagen. Klicke „Create“.
    • Speichere das hud.gd Script (Strg + S).
  2. Referenz auf ScoreLabel und Aktualisierungsfunktion: In diesem Script referenzieren wir unser ScoreLabel und erstellen eine Funktion, die den Text aktualisiert.

Schritt 3: Signal im Player-Script deklarieren und aussenden

Unser Player wird den Punktestand verwalten und ein Signal aussenden, wann immer sich dieser ändert. Das HUD wird dann auf dieses Signal hören.

  1. Öffne dein player.gd Script.
  2. Ganz oben im Script, unter class_name Player extends CharacterBody2D, deklarieren wir ein neues Signal namens score_updated. Dieses Signal wird einen Integer-Wert (den neuen Punktestand) übergeben.

3. Gehe zur Funktion collect_coin(). Hier erhöhen wir den Punktestand und senden dann das
score_updated-Signal mit dem neuen Wert aus. Das alte print zur Score-Ausgabe ist nun
optional, da das UI dies übernimmt.

Schritt 4: Die UI-Scene in die World-Scene instanziieren und Signale verbinden

Jetzt fügen wir unsere neu erstellte hud.tscn Scene in unsere world.tscn Scene ein und stellen die Verbindung zwischen dem Player-Signal und dem HUD her.

  1. Öffne die Scene world.tscn.
  2. Instanziiere die HUD-Scene:
    • Wähle im Scene Dock den Root-Node World aus.
    • Ziehe die Datei hud.tscn aus dem Filesystem Dock (links unten) auf den World Node im Scene Dock.
    • Du siehst nun HUD als Child von World im Scene Dock.
  3. Verbinde das Signal im world.gd Script: Da die World-Scene sowohl den Player als auch das HUD kennt, ist sie der perfekte Ort, um die Signalverbindung herzustellen. Öffne dein world.gd Script. Wir passen die _ready()-Funktion an, um die Referenzen zu holen und die Verbindung herzustellen.

Darauf achten: Signal-Verbindungen

Die Signal-Verbindung player_node.score_updated.connect(hud_node.update_score_display) ist ein Paradebeispiel für lose Kopplung. Der Player weiß nichts über das HUD und das HUD weiß nichts über den Player. Sie kommunizieren über ein abstraktes Signal, das von der World-Scene als Vermittler verbunden wird. Nur die World kennt beide. Das macht unseren Code robuster und leichter wartbar.


Schritt 5: Speichern und Ausführen

  1. Speichere alles (Strg + Alt + Shift + S).
  2. Führe das Projekt aus (F5).

Ergebnis:

Du siehst nun die Score-Anzeige in der oberen linken Ecke. Wenn du Münzen einsammelst, erhöht sich die Zahl! Die Aktualisierung erfolgt nun elegant über das Signalsystem.


Dein nächster Schritt

Sehr gut! Du hast gelernt, wie man ein grundlegendes User Interface (UI) in Godot erstellt, indem man eine separate, wiederverwendbare Scene dafür nutzt. Du hast das Konzept von CanvasLayer und Label verstanden und erfolgreich das Signalsystem von Godot verwendet, um den Punktestand zwischen dem Player und dem UI zu kommunizieren. Dies ist ein entscheidender Schritt für ein sauberes und erweiterbares Spiel-Design.

Als Nächstes werden wir unser Spiel um ein Hauptmenü erweitern und lernen, wie man zwischen verschiedenen Szenen wechselt. Dies ist ein essenzielles Konzept, um ein vollständiges Spielerlebnis zu schaffen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..