Ihr erstes Skript erstellen

In dieser Lektion werden Sie Ihr erstes Skript programmieren, um das Godot-Symbol mit GDScript im Kreis drehen zu lassen. Wie wir in der Einführung erwähnt haben, gehen wir davon aus, dass Sie über Programmierkenntnisse verfügen.

../../_images/scripting_first_script_rotating_godot.gif

Siehe auch

Um mehr über GDScript, seine Schlüsselwörter und seine Syntax zu erfahren, besuchen Sie die GDScript-Referenz.

Projektkonfiguration

Bitte legen Sie ein neues Projekt an, um mit einer blanken Fläche zu beginnen. Ihr Projekt sollte ein Bild enthalten: das Godot-Symbol, das wir häufig für die Prototypenerstellung in der Community verwenden.

Wir müssen ein Sprite-Node erstellen, um es im Spiel anzuzeigen. Klicken Sie im Szenen-Dock auf die Schaltfläche Anderes Node.

../../_images/scripting_first_script_click_other_node.png

Geben Sie „Sprite“ in die Suchleiste ein, um Nodes zu filtern, und doppelklicken Sie auf Sprite, um das Node zu erstellen.

../../_images/scripting_first_script_add_sprite_node.png

Die Registerkarte "Szene" sollte jetzt nur noch ein Sprite-Node enthalten.

../../_images/scripting_first_script_scene_tree.png

Ein Sprite-Node braucht eine Textur, um angezeigt zu werden. Im Inspektor auf der rechten Seite sehen Sie, dass die Eigenschaft Textur "[leer]" lautet. Um das Godot-Symbol anzuzeigen, klicken Sie auf die Datei icon.png und ziehen Sie sie aus dem FileSystem-Dock auf den Textur-Slot.

../../_images/scripting_first_script_setting_texture.png

Bemerkung

Sie können Sprite-Nodes automatisch durch Ziehen und Ablegen von Bildern auf das Ansichtsfenster erstellen.

../../_images/scripting_first_script_dragging_sprite.png

Klicken und ziehen Sie dann das Symbol in das Ansichtsfenster, um es in der Spielansicht zu zentrieren.

../../_images/scripting_first_script_centering_sprite.png

Ein neues Skript erstellen

Um ein neues Skript zu erstellen und an unseres Node anzuhängen, klicken Sie mit der rechten Maustaste auf Sprite im Szenendock und wählen Sie „Skript anhängen“.

../../_images/scripting_first_script_attach_script.png

The Attach Node Script window appears. It allows you to select the script's language and file path, among other options.

Ändern Sie die Vorlage von "Standard" in "Leer", um mit einer sauberen Datei zu beginnen. Belassen Sie die anderen Optionen in der Standardeinstellung und klicken Sie auf die Schaltfläche Erstellen, um das Skript zu erstellen.

../../_images/scripting_first_script_attach_node_script.png

The Script workspace should appear with your new Sprite.gd file open and the following line of code:

extends Sprite

Jede GDScript-Datei ist implizit eine Klasse. Das Schlüsselwort extends definiert die Klasse, die dieses Skript erbt oder erweitert. In diesem Fall ist es Sprite, was bedeutet, dass unser Skript Zugriff auf alle Eigenschaften und Funktionen des Sprite-Nodes erhält, einschließlich der Klassen, die es erweitert, wie Node2D, CanvasItem, und Node.

Bemerkung

Wenn Sie in GDScript die Zeile mit dem Schlüsselwort extends weglassen, erweitert Ihre Klasse implizit Reference, die Godot verwendet, um den Speicher Ihrer Anwendung zu verwalten.

Zu den vererbten Eigenschaften gehören die, welche Sie im Inspektor-Dock sehen können, wie z. B. texture in unserem Node.

Bemerkung

Standardmäßig zeigt der Inspektor die Eigenschaften eines Nodes in Groß- und Kleinschreibung an, wobei die Wörter durch ein Leerzeichen getrennt sind. Im GDScript-Code sind diese Eigenschaften in "snake_case", Kleinbuchstaben und durch einen Unterstrich getrennte Wörter.

Sie können den Mauszeiger über den Namen einer Eigenschaft im Inspektor bewegen, um eine Beschreibung und den Bezeichner im Code zu sehen.

Hallo, Welt!

Unser Skript tut derzeit nichts. Lassen wir es den Text "Hallo, Welt!" in das untere Ausgabefeld drucken, um loszulegen.

Fügen Sie den folgenden Code in Ihr Skript ein:

func _init():
    print("Hello, world!")

Schauen wir uns das mal an. Das Schlüsselwort func definiert eine neue Funktion namens _init. Dies ist ein spezieller Name für den Konstruktor unserer Klasse. Die Engine ruft _init() bei jedem Objekt oder Node auf, wenn es im Speicher erstellt wird, wenn Sie diese Funktion definieren.

Bemerkung

GDScript ist eine einrückungsbasierte Sprache. Der Tabulator am Anfang der Zeile mit der Aufschrift print() ist notwendig, damit der Code funktioniert. Wenn Sie ihn weglassen oder eine Zeile nicht richtig einrücken, wird der Editor sie rot markieren und die folgende Fehlermeldung anzeigen: "Unerwartete Einrückung."

Speichern Sie die Szene, falls Sie das noch nicht getan haben, und drücken Sie F6, um sie zu starten. Schauen Sie sich das untere Ausgabefeld an, das sich ausklappt. Es sollte "Hallo, Welt!" anzeigen

../../_images/scripting_first_script_print_hello_world.png

Löschen Sie die Funktion _init(), so dass nur die Zeile extends Sprite übrig bleibt.

Umdrehen

Es ist an der Zeit, unser Node zu bewegen und zu drehen. Dazu fügen wir zwei Variablen zu unserem Skript hinzu: die Bewegungsgeschwindigkeit in Pixeln pro Sekunde und die Winkelgeschwindigkeit in Bogenmaß pro Sekunde.

extends Sprite

var speed = 400
var angular_speed = PI

Die Mitgliedsvariablen stehen am Anfang des Skripts, vor den Funktionen. Jede Nodeinstanz, der dieses Skript zugeordnet ist, hat ihre eigene Kopie den Eigenschaften speed und angular_speed.

Bemerkung

Wie in einigen anderen Engines arbeiten Winkel in Godot standardmäßig im Bogenmaß, aber Sie haben eingebaute Funktionen und Eigenschaften zur Verfügung, wenn Sie es vorziehen in Winkeln zu rechnen.

Um unser Symbol zu bewegen, müssen wir seine Position und Drehung in jedem Frame der Spielschleife aktualisieren. Wir können die virtuelle Funktion _process() der Klasse Node verwenden. Wenn Sie die Funktion in einer Klasse definieren, welche die Klasse Node erweitert, wie z.B. Sprite, ruft Godot die Funktion bei jedem Frame auf und übergibt ihr ein Argument namens delta, die seit dem letzten Frame verstrichene Zeit.

Bemerkung

Bei Spielen werden viele Bilder pro Sekunde gerendert, die als Frames bezeichnet werden, und zwar in einer Schleife. Wir messen die Rate, mit der ein Spiel Bilder produziert, in Frames Per Second (FPS). Die meisten Spiele streben 60 FPS an, obwohl man bei langsameren Mobilgeräten auch Werte wie 30 FPS oder bei Virtual-Reality-Spielen 90 bis 240 FPS finden kann.

Die Engine und die Spieleentwickler tun ihr Bestes, um die Spielwelt zu aktualisieren und Bilder in einem konstanten Zeitintervall zu rendern, aber es gibt immer kleine Schwankungen bei den Renderzeiten der Frames. Deshalb liefert uns die Engine diesen Delta-Zeitwert, der unsere Bewegung unabhängig von unserer Framerate macht.

Definieren Sie am Ende des Skripts die Funktion:

func _process(delta):
    rotation += angular_speed * delta

Das Schlüsselwort func definiert eine neue Funktion. Danach müssen wir den Namen der Funktion und die Argumente, die sie benötigt, in Klammern setzen. Ein Doppelpunkt beendet die Definition, und die folgenden eingerückten Blöcke sind der Inhalt oder die Anweisungen der Funktion.

Bemerkung

Beachten Sie, dass _process(), wie _init(), mit einem führenden Unterstrich beginnt. Godot's virtuelle Funktionen, d.h. eingebaute Funktionen, die Sie überschreiben können, um mit der Engine zu kommunizieren, beginnen mit einem Unterstrich.

Die Zeile innerhalb der Funktion, rotation += angular_speed * delta, erhöht die Rotation unseres Sprites in jedem Frame. Hier ist rotation eine Eigenschaft, die von der Klasse Node2D geerbt wurde, die Sprite erweitert. Sie steuert die Drehung unseres Nodes und arbeitet mit Bogenmaß.

Tipp

Im Code-Editor können Sie bei gedrückter Strg-Taste auf jede eingebaute Eigenschaft oder Funktion klicken, z. B. position, rotation, oder _process, um die entsprechende Dokumentation in einem neuen Tab zu öffnen.

Führen Sie die Szene aus, um zu sehen, wie sich das Godot-Symbol an Ort und Stelle dreht.

../../_images/scripting_first_script_godot_turning_in_place.gif

Vorwärtskommen

Lassen Sie uns nun das Node verschieben. Fügen Sie der Funktion _process() die folgenden beiden Zeilen hinzu und achten Sie darauf, dass die neuen Zeilen genauso eingerückt werden wie die vorherigen.

var velocity = Vector2.UP.rotated(rotation) * speed

position += velocity * delta

Wie wir bereits gesehen haben, definiert das Schlüsselwort var eine neue Variable. Wenn Sie es an den Anfang des Skripts setzen, definiert es eine Eigenschaft der Klasse. Innerhalb einer Funktion definiert es eine lokale Variable: Sie existiert nur innerhalb des Funktionsbereichs.

Wir definieren eine lokale Variable namens velocity, einen 2D-Vektor, der sowohl eine Richtung als auch eine Geschwindigkeit darstellt. Um das Node vorwärts zu bewegen, gehen wir von der Konstante Vector2.UP der Klasse Vector2 aus, einem nach oben zeigenden Vektor, und drehen ihn durch Aufruf der Methode Vector2.rotated(). Dieser Ausdruck, Vector2.UP.rotated(rotation), ist ein Vektor, der relativ zu unserem Symbol nach vorne zeigt. Multipliziert mit unserer Eigenschaft speed ergibt sich eine Geschwindigkeit, mit der wir das Node vorwärts bewegen können.

Wir fügen velocity * delta zu der Nodes position hinzu, um ihn zu verschieben. Die Position selbst ist vom Typ Vector2, einem eingebauten Typ in Godot, der einen 2D-Vektor darstellt.

Führen Sie die Szene aus, um den Godot-Kopf im Kreis laufen zu sehen.

../../_images/scripting_first_script_rotating_godot.gif

Bemerkung

Beim Verschieben eines solchen Nodes werden Kollisionen mit Wänden oder dem Boden nicht berücksichtigt. In Your first 2D game lernen Sie einen anderen Ansatz, um Objekte zu bewegen und dabei Kollisionen zu erkennen.

Our node currently moves by itself. In the next part Eingaben des Spielers abhören, we'll use player input to control it.

Complete script

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

extends Sprite

var speed = 400
var angular_speed = PI


func _process(delta):
    rotation += angular_speed * delta

    var velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta