Eingaben des Spielers abhören

Building upon the previous lesson Ihr erstes Skript erstellen, let's look at another important feature of any game: giving control to the player. To add this, we need to modify our Sprite.gd code.

../../_images/scripting_first_script_moving_with_input.gif

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

  1. Die eingebauten Input Callbacks, hauptsächlich _unhandled_input(). Wie _process(), ist es eine eingebaute 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 Werkzeug, 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.

For turning, we should use a new variable: direction. In our _process() function, replace the rotation += angular_speed * delta line with the code below.

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 der Spieler nach rechts gehen will, und -1 bedeutet, dass er nach links gehen will.

Um diese Werte zu erzeugen, führen wir Bedingungen und die Verwendung von Input ein. 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 nimmt 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 D-Pad eines Gamepads drückt.

Bemerkung

Sie können die Eingabeaktionen in Ihrem Projekt sehen und bearbeiten, indem Sie zu Projekt -> Projekteinstellungen gehen und auf die Registerkarte Input Map 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 Symbol 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 eingebauten 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.

Complete script

Hier ist die vollständige Sprite.gd-Datei als Referenz.

extends Sprite

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 eingebauten Klassen der Engine erweitert. Die Node-Typen, von denen Ihre Klassen erben, geben Ihnen Zugang zu Eigenschaften wie rotation und position in unserem Sprite Fall. 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 Knopfdrü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 the next lesson Using signals, we'll build upon the relationship between scripts and nodes by having our nodes trigger code in scripts.