Mein erstes Godot-Projekt | Teil 1: Wie alles begann

  • Mein erstes Godot-Projekt


    Bestimmt haben manche von euch schonmal den Godot-Editor gestartet, ohne bösen Hintergedanken ein neues Projekt erstellt und dies zum bearbeiten geöffnet... Doch dann kommt die Frage: Was mache ich jetzt?

    Dieser Beitrag soll dazu dienen, diese Frage in eine weniger verzweifelte Lage zu rücken.


    Godot Engine arbeitet mit sogenannten "Szenen": Die meisten werden vermutlich denken, dass Szenen quasi nur als verschiedene Karten gebraucht werden, auf denen sich der Spieler bewegt, wie es zum Beispiel beim RPG Maker der Fall ist, aber dem ist nicht so. Der Spieler kann zum Beispiel selber eine Szene sein, welche dann auf einer anderen Szene instanziiert oder einfacher, platziert wird.


    Bei Kartenwechsel würde man also eher überlegen den alten Spieler zu löschen und auf der neuen Szene einfach einen neuen Spieler zu platzieren, als man im spielerischen Sinne wohl denkt, dass der Spieler teleportiert wird.

    Oder man hat einen Gegner, welcher andere Gegner auf der Karte spawnt, hier würde man die Szene des neuen Gegners einfach in die momentane Szene instanziieren, quasi Duplikate erschaffen.



    Gucken wir uns doch zunächst einmal die oberste Leiste an. Hier kann man wählen zwischen


    2D: Zeigt die 2D Ansicht der momentanen Szene an (2D-Spiele sind für Einsteiger empfehlenswert).

    3D: Zeigt die 3D Ansicht der momentanen Szene an.

    Script: Zeigt den Script-Editor an.

    AssetLib: Öffnet einen Libary Store, in dem man sich kostenlos Ressourcen oder vorgefertigte Demo-Projekte herunterladen kann.


    Weiter rechts findet man dann


    Pfeil: Startet das Projekt mit der ausgewählten "Anfangsszene".

    Stopp: Pausiert die Anwendung des Projektes (Spiel muss gestartet sein).

    Abbrechen: Stoppt die Anwendung des Projektes (Spiel muss gestartet sein).

    Filmklappe mit Pfeil: Startet das Projekt mit der momentan geöffneten Szene.

    Filmklappe mit Ordner: Tool um Szenen schnell zu starten, wird aber meistens nicht gebraucht...


    Wenn wir nun aber versuchen durch Drücken auf den Pfeil unser Spiel zu starten, erhalten wir folgende Meldung:



    Abbruch, die Engine ist verbuggt... schnell noch zu Unity wechseln...


    Nein ^^ Godot möchte uns nur höflich darauf hinweisen, dass er gar nicht weiß, mit welcher Anfangszene er das Projekt nun starten soll. Und wir wollen ja nicht, dass der Computer entscheidet womit unser vollkommenes Spiel beginnt... Versuchen wir uns also eine Test-Szene zu erstellen, welche dann standardmäßig jedesmal gestartet wird, wenn wir auf diesen lustigen Pfeil klicken:


    Deshalb müssen wir erst einmal eine Szene abspeichern, bevor wir diese dann als "Anfangszene" festlegen können. Wenn wir dies nun aber versuchen, kommt folgende nette Meldung:


    Hmmm... Eine Wurzel... Und damit herzlich Willkommen zu meinem Kräuterkundeunterricht!


    Doch womit uns Godot eigentlich konfrontieren möchte, sind sogenannte "Knoten", oder wie sie unser englischer Freund nennen würde: "Nodes"!


    Nodes bilden quasi unseren Werkzeugkasten für jede gelungene Szene: Es gibt für fast jede Funktion ein dafür angefertigtes Node!

    So wie der Automechaniker also zum Schraubenschlüssel greifen würde um eine Schrauber festzuziehen, greift der Informatiker zu einem Sprite-Node, wenn er eine Grafik anzeigen lassen will.

    Praktischerweise sind diese Nodes auch noch in Farben unterteilt um grob eingliedern zu können, in welchem Bereich man sich gerade befindet:


    Blau: Node2D. Alle Nodes welche zu dieser Gruppe angehören sind dafür bestimmt im 2D-Umfeld verwendet zu werden und zeichnen meistens auch etwas auf den Bildschirm (Bsp.: Sprite-Node)

    Sie haben eine Position und sind somit in der Szene verschiebbar


    Rot: Spatial. s. Blau nur für 3D


    Grün: Control. Wie der Name schon sagt sind alle Nodes dieser Gruppe für Steuerung zuständig


    Tiefer ins Detail will ich da auch nicht gehen... Ich empfehle einfach sich im Internet über die einzelnen Nodes explizit zu informieren. Denn man weiß nur was man machen kann, wenn man weiß was man hat ;)


    Erstellen wir also einfach ein Node. Ein graues Node ohne jegliche Funktionen als einfach nur da zu sein. Es hat keine Position, ist somit unbewegbar, und dient quasi nur als "Vater" welcher dann irgendwann über seine kleinen "Kinder"-Nodes wacht. Dieses Node können wir nun mit einem Doppelklick darauf umbenennen. Es empfiehlt sich einen Namen zu wählen welcher die Szene gut zusammenfasst, in unserem Fall wäre "game" sicher ganz passend...


    Wenn wir das nun also endlich hinter uns haben, können wir nun die Szene abspeichern (Über effektive Dateistrukturen bei Godot-Projekten komme ich vielleicht wann anders zu sprechen...) und sie beim Drücken auf den Pfeil dann als Hauptszene auswählen. Nun sollte sich ein Fenster öffnen, bei dem nichts anderes als ein grauer Bildschirm zu sehen ist. Keine Fehler... Schön, wird haben etwas erreicht! Unser Spiel ist bugfrei!

    Doch was wird nur passieren, wenn wir uns selbst ein kleines Script basteln?... Mir graut es schon...


    Scripting


    Godot Engine kann man in 2 verschiedenen Varianten downloaden:

    - Standard (GDScript, wird von mir immer verwendet)

    - Mono Version (C# Support)


    Die Mono Version ist glaube ich noch nicht komplett ausgereift, aber viel habe ich mich damit nicht beschäftigt...


    Doch wo liegt nun der Unterschied?

    GDScript ist eine Programmiersprache, welche extra für Godot entwickelt wurde. Sie ähnelt dabei sehr stark Python.

    C# ist eine andere populäre Programmiersprache welche eben bei Leuten welche schon programmieren können gerne verwendet wird.


    Ich kann da nicht viel sagen, ich weiß aber das es einen leistungstechnischen Unterschied gibt bei logischen Operationen bei GDScript gegenüber C#.

    Wer also eine Schach KI zum Beispiel oder eine Echtzeitsimulation entwickeln will, versucht wohl besser mit der C# Version klar zu kommen. Ansonsten merkt man diesen Unterschied allerdings nicht.


    Erstellen wir also unser erstes GDScript-Script-Script..Scr... GDScript-Script!


    Dazu klicken wir auf unser "game"-Node und dann auf die Schriftrolle mit dem grünen Plus oben rechts. Nun öffnet sich ein Optionsfenster, welches wir allerdings unberührt lassen können.

    Wir müssen aber bei "Pfad" unser Script irgendwo abspeichern, es empfielt sich dieses Script irgendwo in der Nähe der Szene abzuspeichern, damit irgendwann kein Tohuwabohu entsteht...


    ('#' Sind in GDScript Kommentare)


    extends Node: Dieses Script erbt von diesem Node-Typ. Eigenschaften, Funktionen... Wird immer benötigt um auf die Funktionen der spezifischen Nodes zuzugreifen. (Heißt dann aber je nach Node anders!)


    func _ready(): Funktion welche jedes Node besitzt: Sie wird aufgerufen wann immer das Node in der Szene instanziiert ist und quasi "betriebsbereit" ist.


    func _process(delta): Funktion welche jede Frame aufgerufen wird. Delta wird verwendet um eine Zeitkonstante zu haben und beinhaltet die Zeit, welche seit dem letzten Frame vergangen ist.


    pass: Eine Funktion muss Befehle beinhalten. Dieses Statement dient jediglich dazu einfach nichts zu tun, umgeht aber den Syntax-Fehler, welcher ohne dieses Statement entstehen würde.


    Dieses Script macht nun genau soviel wie unser Spiel: Nichts.

    Wenn wir aber unser berühmtes "Hallo Welt"-Script erstellen wollen, säe das wie folgt aus:


    Code
    1. extends Node
    2. func _ready():
    3. # Node ist bereit, bist du es auch?
    4. print("Hallo Welt!")


    print: Schreibt etwas auf die Konsole (In dem Fall: "Hallo Welt!")


    Nun können wir unten auf unserer Konsole eben diesen Hilfeschrei unseres Programmes begutachten und uns laut auf die Schulter klopfen: Wir haben es geschafft. Es tut!


    Nachdem unser erstes Godot Projekt diesen Meilenstein überwunden hat, frage ich mich wo es unser unschuldiges Projekt wohl als nächstes hinziehen wird...

  • Hi


    Mal eine Frage.


    Kann man in Godot den Viewport so aufteilen, dass z.B 2 Kameras fix positioniert sind und eine Kamera dem Spieler folgt?

    Das heisst , das Spielgeschehen soll nur in einem bestimmten Bereich des Viewport gerendert werden. Die beiden anderen Kameras zeigen die GUI.


    Beispiele wären Legend of Grimrock, Lands of Lore, Might & Magic und solche "old school" FPS RPGs

  • Ich glaube das, was du erreichen willst, wird eher mit einem CanvasLayer gelöst.

    CanvasLayer bewirkt, dass dessen Children statisch am Bildschirm und nicht auf der Karte "kleben".


    Die Kamera machst du dann einfach als children des KinematicBodies des Spielers und setzt einen Haken bei "current".


    Aber grundsätzlich zu deiner Frage: Ja, das würde auch gehen, ist aber in dem Fall unnötig kompliziert.