Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Auf Spielereingaben hören

Aufbauend auf der vorangegangenen Lektion, Erstellen eines ersten Skripts, wollen wir uns nun ein weiteres wichtiges Merkmal eines Spiels ansehen: dem Spieler die Kontrolle zu geben. Um dies hinzuzufügen, müssen wir unseren sprite_2d.gd-Code ändern.

../../_images/scripting_first_script_moving_with_input.gif

Sie haben zwei Hauptinstrumente, um die Eingaben des Spielers in Godot zu verarbeiten:

  1. Die Built-in-Eingabe-Callbacks, hauptsächlich _unhandled_input(). Wie _process(), ist es eine fest integrierte virtuelle Funktion, die Godot jedes Mal aufruft, wenn der Spieler eine Taste drückt. Es ist das Werkzeug, das Sie benutzen wollen, um auf Ereignisse zu reagieren, die nicht in jedem Frame passieren, wie das Drücken von Space, um zu springen. Um mehr über Eingabe-Callbacks zu erfahren, siehe Verwendung von InputEvent.

  2. Das Input Singleton. Ein Singleton ist ein global zugängliches Objekt. Godot bietet in Skripten Zugriff auf mehrere. Es ist das richtige Werzeug, um in jedem Frame nach Eingaben zu suchen.

Wir werden das Input-Singleton hier verwenden, da wir wissen müssen, ob der Spieler sich in jedem Frame drehen oder bewegen will.

Zum Drehen sollten wir eine neue Variable verwenden: direction. Ersetzen sie in der _process() Funktion die Zeile rotation += angular_speed * delta mit dem untenstehenden Code.

var direction = 0
if Input.is_action_pressed("ui_left"):
    direction = -1
if Input.is_action_pressed("ui_right"):
    direction = 1

rotation += angular_speed * direction * delta

Unsere lokale Variable direction ist ein Multiplikator, der die Richtung angibt, in die sich der Spieler drehen will. Ein Wert von 0 bedeutet, dass der Spieler weder die linke noch die rechte Pfeiltaste gedrückt hat. Ein Wert von 1 bedeutet, dass sich der Spieler nach rechts drehen will, und -1 bedeutet, dass er sich nach links drehen will.

Um diese Werte zu erzeugen, erklären wir zunächst Bedingungen und die Verwendung von Input. Eine Bedingung beginnt mit dem Schlüsselwort if in GDScript und endet mit einem Doppelpunkt. Die Bedingung ist der Ausdruck zwischen dem Schlüsselwort und dem Ende der Zeile.

Um zu prüfen, ob in diesem Frame eine Taste gedrückt wurde, rufen wir Input.is_action_pressed() auf. Die Methode erwartet als Argument einen Textstring, der eine Eingabeaktion darstellt, und gibt true zurück, wenn die Aktion gedrückt wurde, andernfalls false.

Die beiden Aktionen, die wir oben verwenden, "ui_left" und "ui_right", sind in jedem Godot-Projekt vordefiniert. Sie werden jeweils ausgelöst, wenn der Spieler die Pfeile links und rechts auf der Tastatur oder links und rechts auf dem Steuerkreuz eines Gamepads drückt.

Bemerkung

Sie können die Eingabeaktionen in Ihrem Projekt sehen und bearbeiten, indem Sie zu Projekt -> Projekteinstellungen gehen und auf den Input „Eingabe-Zuordnung“-Tab klicken.

Schließlich verwenden wir direction als Multiplikator, wenn wir die rotation des Nodes aktualisieren: rotation += angular_speed * direction * delta.

Wenn Sie die Szene mit diesem Code ausführen, sollte sich das Icon drehen, wenn Sie Links und Rechts drücken.

Bewegung beim Drücken von "oben"

Um sich nur zu bewegen, wenn eine Taste gedrückt wird, müssen wir den Code ändern, der die Geschwindigkeit berechnet. Ersetzen Sie die Zeile, die mit var velocity beginnt, durch den folgenden Code.

var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
    velocity = Vector2.UP.rotated(rotation) * speed

Wir initialisieren die velocity mit einem Wert von Vector2.ZERO, eine weitere Konstante vom Built-in-Typ Vector, die einen 2D-Vektor der Länge 0 darstellt.

Wenn der Spieler die Aktion "ui_up" drückt, aktualisieren wir den Geschwindigkeitswert, so dass das Sprite sich vorwärts bewegt.

Vollständiges Skript

Hier ist die vollständige Datei sprite_2d.gd als Referenz.

extends Sprite2D

var speed = 400
var angular_speed = PI


func _process(delta):
    var direction = 0
    if Input.is_action_pressed("ui_left"):
        direction = -1
    if Input.is_action_pressed("ui_right"):
        direction = 1

    rotation += angular_speed * direction * delta

    var velocity = Vector2.ZERO
    if Input.is_action_pressed("ui_up"):
        velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta

Wenn Sie die Szene starten, sollten Sie nun in der Lage sein, sich mit den Pfeiltasten links und rechts zu drehen und mit Oben vorwärts zu bewegen.

../../_images/scripting_first_script_moving_with_input.gif

Zusammenfassung

Zusammenfassend lässt sich sagen, dass jedes Skript in Godot eine Klasse darstellt und eine der Built-in-Klassen der Engine erweitert. Die Node-Typen, von denen Ihre Klassen erben, geben Ihnen Zugang zu Eigenschaften wie rotation und position im Falle unseres Sprites. Sie erben auch viele Funktionen, die wir in diesem Beispiel nicht verwenden konnten.

In GDScript sind die Variablen, die Sie an den Anfang der Datei stellen, die Eigenschaften Ihrer Klasse, auch Member-Variablen genannt. Neben Variablen können Sie auch Funktionen definieren, die größtenteils die Methoden Ihrer Klassen sind.

Godot bietet mehrere virtuelle Funktionen, die Sie definieren können, um Ihre Klasse mit der Engine zu verbinden. Dazu gehören _process(), um bei jedem Frame Änderungen am Node vorzunehmen, und _unhandled_input(), um Eingabeereignisse wie Tasten- und Buttondrücke von den Benutzern zu empfangen. Es gibt noch eine ganze Reihe weiterer.

Das Input Singleton ermöglicht es Ihnen, überall in Ihrem Code auf die Eingaben der Spieler zu reagieren. Insbesondere können Sie es in der Schleife _process() verwenden.

In der nächsten Lektion, Signale nutzen, bauen wir auf der Beziehung zwischen Skripten und Nodes auf, indem wir unsere Nodes Code in Skripten auslösen lassen.