In meinem ersten Blogpost zu Godot habe ich bereits davon berichtet, dass ich begonnen habe ein Spiel zu entwickeln. Aber nicht um ein fertiges Spiel zu erstellen, sondern um zu lernen. Das Ziel des Spiels ist es für mich lediglich in Godot einzusteigen, Erfahrung zu sammeln und Fehler zu machen.

Der Code hierfür befindet sich öffentlich in meinem GitLab. Deshalb werde ich in den Blogposts höchstens kleine Codeausschnitte einbringen. Vermutlich wird sich im main-Branch lange Zeit nichts tun, wenn überhaupt. Vermutlich wird dieses Projekt auf ewig im devleopment-Branch bleiben.

Zuerst habe ich mir Assets herausgesucht, da ich aktuell (noch) nicht in der Lage bin, selbst welche zu erstellen. Hierfür habe ich auf itch gesucht und bin auf das 2D Pixel Dungeon Assets Pack gestoßen.

Zuerst habe ich die folgenden Scenes angelegt:

  • Game
  • Main Menu
  • Map 1
  • Player
  • Enemy

Game

Für die Game Node habe ich ein Node2D gewählt. Diese dient als Root Node für das gesamte Spiel. Fürs erste bleibt diese leer, muss aber gespeichert werden, in meinem Fall als game.tscn.

Main Menu

Das Main Menu ist ein MarginContainer-Node. Dieses enthält ein CanvasLayer, einen VBoxContainer, welcher wiederum Title und Version sowie einen weiteren VBoxContainer enthält. In dem inneren VBoxContainer befinden sich die drei Buttons: Continue, New Game und Options.

Map 1

Diese ist eine Node2D, welche zwei TileMapLayer enthält (einen für foreground, einen für background). Das lässt sich bestimmt deutlich besser umsetzten, war aber so die erst Möglichkeit die ich gefunden habe.

Player

Der Player ist ein CharacterBody2D und enthält die Nodes CollisionShape2D und AnimatedSprite2D.

Wie die Namen der Nodes bereits sagen, dient das AnimatedSprite2D dazu, den Sprite zu animieren und die CollisionShape2D dient dazu, eine Form für die Kollision festzulegen.

Enemy

Das ist aktuell einfach nur eine Kopie der Player-Scene. Lediglich die player.gd wurde entfernt, eine enemy.gd hinzugefügt und die Steuerung aus der player.gd wurde durch komische, zufällige Bewegungen ersetzt.

Zusammensetzen

Nachdem ich alle sowiet benötigten Scenes anglegt hatte, habe ich die Map 1 und ein Camera2D-Node zur Game Scene hinzugefügt. Anschließend das Main Menu, den Player und ein Enemy.

Das hat soweit funktioniert, aber leider war alles sehr, sehr klein. Also habe ich in Camera2D > Inspektor unter Zoom den Wert für x auf 4.0 gesetzt (wobei y automatisch auch auf 4.0 gesetzt wird).

Mein nächste Problem war, dass die Camera nun steif auf einen Punkt gerichtet war, weshalb ich die Camera2D in die Player-Node geschoben habe. Dies hat dazu geführt, dass die Camera dem Player folgt.

Die drei Todos

Soweit so gut. In meinem letzten Post erwähnte ich, das ich mir immer nur drei Todos setzen werde, bevor ich weiterdenke.

Die letzten Punkte waren:

  • Das Main Menu zentrieren
  • Musik hinzufügen
  • Touch support hinzufügen

Das Main Menu zu zentrieren war tatsächlich einfach als gedacht. Hierfür habe ich den Main Menu – Node (wie den Camera2D-Node) einfach in den Player geschoben. Tada!

Musik hinzufügen stellte sich auch als nicht sonderlich kompliziert heraus. Hierzu bin ich in die Map 1 Scene und habe der Map_1 Node einen AudioStreamPlayer hinzugefügt. Diesen ausgewählt, konnte ich einfach meine .wav Datei per Drag-and-Drop in den Inspektor unter „Stream“ ziehen. Im Anschluss noch die Option „Autoplay“ aktiviert und schon läuft die Musik, sobald die Map geladen ist.

Der komplizierteste der drei Punkte war der Touch support. Hierfür musste ich etwas Coden.

Ich habe eine if-Condition genutzt um die Position der Maus auszulesen und in die Variable mouse_position zu spiechern, sobald die linke Maustaste gedrückt wird. Anschließend wird geprüft, ob mouse_position gesetzt ist und daraus die angepeilte Richtung berechnet. Falls der Player sich dabei nach links bewegt soll, wie bei der Tastatureingabe auch, der animated_sprite.flip_h auf true gesetzt werden. Bei einer Bewegung nach rechts soll der Wert false sein.

Und das war es bereits mit den drei Todos.

Ausblick

Wie auch beim letzten mal, habe ich nun drei weitere Todos:

  • Refactoring der player.gd
  • Vergrößern der Map 1
  • Zweite Ebene (Map 2) inkl. Teleporter erstellen

Die player.gd wird mir jetzt schon zu unübersichtlich und ich habe meinen Code gerne clean.

Die Map 1 ist recht klein und ich hätte gerne ein paar coole Räume, damit auch etwas erkundet werden kann.

Die zweite Ebene möchte ich gerne deshalb einbauen, weil mich interessiert, wie die Teleporter am besten umgesetzt werden können.

Von timo

Schreibe einen Kommentar

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