Spielentwicklung mit Godot 🤖

Skip to content

Dies ist ein maschinell übersetzter Text, der Fehler enthalten kann!

Woher stammen diese Informationen?

Vieles davon ist lediglich eine Wiederholung der offiziellen Godot-Dokumentation. Im Folgenden finden Sie einige nützliche Links zur offiziellen Dokumentation (die ich vorzuziehen würde, anstelle dieser auf Piggy, aber wenn Sie diese bevorzugen, nutzen Sie sie gerne!)

Nützliche Ressourcen:

Was ist mit der Grafik, muss ich sie selbst erstellen?

Nein! Sie können hier viele kostenlose Assets finden:

Andere Game-Engines?

Wenn Sie es vorziehen, können Sie andere Game Engines verwenden. Beispiele für weitere Game Engines sind:

Es gibt noch viele mehr – suchen Sie gerne danach, wenn Sie etwas anderes ausprobieren möchten!

Was ist Godot?

Godot (ausgesprochen „Guh-doh“) ist eine Spiel-Engine. Einfach ausgedrückt handelt es sich um ein Programm, mit dem Sie Spiele erstellen können – oder auch normale Programme, falls gewünscht. Godot kann fast alles das Gleiche leisten wie andere Game Engines und unterstützt sowohl 2D als auch 3D.

Beispiele für in Godot entwickelte Spiele: Godot Showcase

Es wurden nicht nur Indiespiele in Godot entwickelt; sogar Sonic Colors Ultimate wurde mit Godot erstellt! 🦔🦔🦔

Wie bekommst du Gottit hinuntergeladen?

Du kannst Godot entweder von folgenden Quellen herunterladen:

Einfach downloaden und installieren (oder direkt über Steam ausführen).

Erstelle ein Projekt!

Wenn du Godot startest, erscheint dieses Fenster:

Godot Projekt

Hier wirst du nach der Programmiersprache gefragt, GDScript oder C#. GDScript ist sehr ähnlich wie Python.

Unterschiede zwischen GDScript und Python (ohne Farben):

def hello():
    text = "Hello world!"

    print(text)
func hello():
    var text = "Hello world!"

    print(text)

Für Variablen in Python musst du nur den Namen der Variable schreiben. In GDScript musst du zuerst var schreiben. Um Funktionen zu erstellen, schreibst du func anstelle von def.

Szenen und Knoten (Nodes)

Eines der wichtigsten Konzepte in Godot sind Szenen und Knoten (Nodes). Wir beginnen mit den Knoten. Ein Node ist ein Objekt in Godot und kann alles darstellen. Es kann etwas sein, das einen Spieler darstellt, einen Feind, eine Taste in einem Menü, Text auf dem Bildschirm oder vieles mehr. Szenen bestehen aus einer Sammlung von Knoten.

Hier werden wir ein sehr einfaches Beispiel erstellen.

Teil 1a – Erstelle die „Spieler“-Szene

Klicke oben im Godot-Fenster auf die Schaltfläche „2D“, um zur 2D-Ansicht zu wechseln.

Auf der linken Seite des Fensters siehst du folgende Benutzeroberfläche:

Szene erstellen

Klicke auf die Taste „Other Node“ und suche nach „CharacterBody2D“. Wähle diesen Eintrag aus und klicke dann auf „Create“. Dies ist ein Knotentyp (Node), der für einen 2D-Spieler verwendet wird. Möglicherweise bemerkst du neben dem „CharacterBody2D“-Knoten ein Warndreieck ⚠️. Das liegt daran, dass ihm einige empfohlende Elemente fehlen.

Wenn du mit der rechten Maustaste auf den Knoten klickst, erscheint eine Option „+ Add Child Node…“. Verwende diese Funktion, um zwei weitere Knoten hinzuzufügen: Sprite2D und CollisionShape2D. Der Sprite2D-Knotens dient dazu, Grafiken zum Spieler hinzuzufügen, während der andere Kollisionserkennung ermöglicht. Du kannst ihnen auch eigene Namen geben, falls das dir hilft, den Überblick zu behalten. Ich habe meinem CharacterBody2D-Objekt den Namen „Player“ gegeben. So sollte die Szene nun aussehen:

Szene aktuell

Teil 1b – Das ⚠️ auf dem CollisionShape2D beheben

Das Warnsymbol zeigt an, dass das CollisionShape2D-Objekt tatsächlich keine Kollision hat. Dies können Sie beheben, indem Sie die Knotenkategorie links auswählen und somit ein Panel auf der rechten Seite öffnen. Hier erhalten Sie viele Informationen über diesen Knoten, die Sie ändern können. Es empfiehlt sich, mit den vorhandenen Optionen herumzuspielen. Der Fokus sollte jedoch auf „Shape“ liegen; setzen Sie dies zum Beispiel auf RectangleShape2D. Die genaue Einstellung ist nicht so wichtig, da wir in diesem Schritt keine Kollisionen verwenden werden.

Teil 1c – Hinzufügen eines Sprites und von Grafiken

Wenn Sie auf Sprite2D links klicken, erscheint rechts das Feld mit der Bezeichnung „Texture“. Hier können Sie ein Bild für den Spieler hinzufügen. Ziehen Sie einfach ein Bild hinein und lassen es dort los.

So sieht es nach dem Hinzufügen eines Sprites aus.

Sprite-Menü

Teil 2 – Eingaben hinzufügen und überprüfen

Ganz oben im Fenster befindet sich eine Menüleiste mit den Punkten „Szene“, „Projekt“, „Debuggen“ (englisch: Debug), „Editor“ und „Hilfe“. Klicken Sie auf „Projekt“ und anschließend auf die Option „Projekteinstellungen“. Dadurch öffnet sich ein Menü mit zahlreichen Einstellungen. Wählen Sie dort den Eintrag „Eingabemappe“. Hier können Tastenbelegungen für das Keyboard festgelegt werden.

  • Geben Sie in das Feld „Neue Aktion hinzufügen“ („Add New Action“) den Begriff left ein und klicken Sie dann auf „Hinzufügen“ (Add).
  • Führen Sie dasselbe nun ebenfalls für rechts, oben und unten aus.
  • Diese Bezeichnungen nennt man Aktionen (Actions).

Für jede dieser Aktionen fügen Sie über Klick auf das Plus-Zeichen (+) rechts daneben weitere Tastaturbefehle hinzu.

Plus-Schaltfläche

Drücken Sie einfach beliebige Taste(n) der gewünschten Kombination am Keyboard, um sie zuzuweisen; danach bestätigen Sie durch einen weiteren Klick auf Hinzufügen (Add). Wiederholen Sie diesen Vorgang analog auch bei allen anderen definierten Aktionen im Kontext Ihrer Steuerungselemente.

Teil 3 – Hinzufügen eines Skripts zur Steuerung des Spielers.

Um die Spiellogik hinzuzufügen, also etwas mit dem Spieler, dem Hintergrund oder sonstigen Elementen im Spiel zu tun haben wollen, benötigen wir ein Skript. Skripte sind Code und können in zwei Sprachen geschrieben werden: GDScript oder C#. Standardmäßig wird GDScript verwendet.

  • Klicken Sie auf den Knoten „CharacterBody2D“ (ich habe ihn „Player“ genannt).
  • Drücken Sie die Schaltfläche „Skript anhängen“ (siehe unten).

Schaltfläche zum Anhängen von Skripten

  • Nun öffnet sich ein Fenster, in dem Sie eine Sprache auswählen (GDScript wählen) sowie einen Pfad festlegen können (lassen Sie diesen einfach beim voreingestellten Namen; Sie können ihm aber auch einen eigenen geben). Bestätigen Sie anschließend durch Weiterklicken. Daraufhin erscheint das „Script“-Fenster. Anfangs enthält es nur wenig Inhalt.

extends CharacterBody2D

Das Einzige, was dieser Code im Moment aussagt, ist, dass der Code zu einem Knoten vom Typ “CharacterBody2D” gehören soll, was unser Spieler ist.

Wir werden hier eine Funktion hinzufügen, die wir verwenden werden, um den Spieler zu manipulieren:

extends CharacterBody2D

func _physics_process(delta: float) -> void:
    return

Physik Prozess?

_physics_process ist eine Funktion, die bei jedem einzelnen “Frame” aktualisiert wird, also etwa 60 Mal pro Sekunde (Standard). Es gibt eine andere Funktion, die einfach nur _process heißt, die über die gesamte Zeit aktualisiert wird. Wenn Sie möchten, dass sich der Spieler mit einer gleichmäßigen Geschwindigkeit bewegt, verwenden Sie _physics_process.

Hier legen wir den Code ein, der den Spieler bewegt.

Teil 4 - Basiseingabe

In Teil 2 hast du Eingabeknöpfe hinzugefügt, jetzt werden wir sie verwenden. Es gibt ein eingebautes Objekt, das Input heißt, das wir verwenden können, um zu prüfen, ob der Spieler auf das gedrückt hat, was wir in der “Input Map” eingerichtet haben.

Versuche, diesen Code in den _physics_process Code einzufügen:

if Input.is_action_pressed('right'):
    velocity.x = 100

move_and_slide()

Was ist move_and_slide()?

move_and_slide() ist eine eingebaute Funktion in Godot, die verwendet wird, wenn wir das, was wir darauf anwenden, tatsächlich bewegen wollen. Ohne diese würde der Spieler sich nicht bewegen.

Warning

Die Leerzeichen in den Zeilen sind sehr wichtig, das ist ähnlich wie in Python.

Was passiert, wenn du das Programm startest, indem du auf die Play-Taste im Godot-Fenster drückst und dann “right” drückst?

Wenn jetzt nichts passiert:

  • Hast du daran gedacht, etwas in “Input Map” einzurichten?
  • Hast du right und nicht Right geschrieben? Also, ist das, was du im Code geschrieben hast, dasselbe wie der Name in der Input Map?

Der gesamte Code bisher
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100

    move_and_slide()

Versuche jetzt, Code für 'links', 'oben', 'unten' hinzuzufügen.

Was muss velocity.x für 'links' sein? Und was ist mit 'oben' und 'unten'?

Der gesamte Code jetzt
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

Teil 5 – Den Code reparieren

Vielleicht fällt euch auf, dass der Spieler nicht anhält, wenn ihr eine Richtung loslasst. Das können wir jetzt beheben!

Vor allen if-Abfragen fügt eine Zeile hinzu, die den Geschwindigkeitswert (Velocity) auf 0 setzt. Dies könnt ihr tun, indem ihr velocity = Vector2() schreibt.

Geschwindigkeit und Richtungen in Godot sind immer Vektoren. Dabei handelt es sich um ein mathematisches Konzept, das wir hier nicht vertiefen werden. Wenn ihr mehr darüber erfahren wollt, was dies bedeutet, schaut hier vorbei: Wikipedia Vektoren.

Der gesamte Code jetzt
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    velocity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

Wenn du das Spiel jetzt startest, kannst du den Spieler bewegen:

Weiterhin könnt ihr den Code so anpassen, dass die Geschwindigkeit nicht nur eine Zahl ist, sondern anderswo gespeichert werden kann.

Du kannst zum Beispiel (vor der Funktion) eine Konstante hinzufügen, die die Geschwindigkeit verfolgt.

Der gesamte Code abschließend mit const
extends CharacterBody2D

const SPEED = 100

func _physics_process(delta: float) -> void:
    velovity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = SPEED
    if Input.is_action_pressed('left'):
        velocity.x = -SPEED
    if Input.is_action_pressed('down'):
        velocity.y = SPEED
    if Input.is_action_pressed('up'):
        velocity.y = -SPEED

    move_and_slide()

Teil 6 – Experimentiere selbst herum!

Wenn ihr zurück zum ersten Abschnitt geht, Nützliche Ressourcen, könnt ihr finden, womit ihr weiter experimentieren könnt.

Danach könnt ihr versuchen, eignes Spiel zu erstellen. Was ihr erschafft, bleibt euch überlassen! Wenn ihr etwas völlig Neues machen wollt, dann macht es! Falls ihr ein bereits existierendes Spiel nachbauen möchtet, ebenfalls! Die beste Art zu lernen ist das Ausprobieren!