{"id":573,"date":"2025-06-03T09:00:00","date_gmt":"2025-06-03T07:00:00","guid":{"rendered":"https:\/\/staratnight.de\/blog\/?p=573"},"modified":"2025-06-01T16:31:14","modified_gmt":"2025-06-01T14:31:14","slug":"der-erste-code-und-node-verhalten","status":"publish","type":"post","link":"https:\/\/staratnight.de\/blog\/der-erste-code-und-node-verhalten\/","title":{"rendered":"Der erste Code und Node-Verhalten"},"content":{"rendered":"\n<p>Nachdem du gelernt hast, Scenes und Nodes zu strukturieren und ihnen visuelle Elemente hinzuzuf\u00fcgen, ist es an der Zeit, ihnen Leben einzuhauchen! In Godot ist der Ort f\u00fcr Verhalten und Logik in deinen Nodes das <strong>Script<\/strong>. Wir nutzen daf\u00fcr haupts\u00e4chlich <strong>GDScript<\/strong>, eine speziell f\u00fcr Godot entwickelte Skriptsprache. Mit ihrer zug\u00e4nglichen, Python-\u00e4hnlichen Syntax wird dir als erfahrenem Programmierer der Einstieg leichtfallen.<\/p>\n\n\n\n<p>In diesem Artikel f\u00fcgen wir ein Skript an unseren <code>Sprite2D<\/code> Node an und bringen ihn dazu, sich zu drehen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 1: Ein Script an den Sprite2D Node anh\u00e4ngen<\/h3>\n\n\n\n<p>Wir beginnen damit, unseren <code>Sprite2D<\/code> Node mit einem Script zu verbinden:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Gehe zur\u00fcck zur 2D-Ansicht (klicke auf den <strong>&#8222;2D&#8220;<\/strong>-Tab oben im Viewport).<\/li>\n\n\n\n<li>W\u00e4hle im Scene Dock deinen <strong>Sprite2D Node<\/strong> aus.<\/li>\n\n\n\n<li>Suche oberhalb des Scene Trees den Button zum Anh\u00e4ngen eines Scripts. Er sieht aus wie eine kleine Pergamentrolle mit einem gr\u00fcnen Plus-Symbol darauf. Klicke diesen Button.<\/li>\n\n\n\n<li>Ein Fenster namens <strong>&#8222;Attach Node Script&#8220;<\/strong> \u00f6ffnet sich.\n<ul class=\"wp-block-list\">\n<li><strong>Inherits: <\/strong>Hier steht automatisch <strong>Sprite2D<\/strong>. Das bedeutet, dein Script wird von der Klasse <code>Sprite2D<\/code> erben. Das Script hat dann Zugriff auf alle Eigenschaften und Funktionen, die ein <code>Sprite2D<\/code> hat (wie <code>texture<\/code>, <code>position<\/code>, <code>rotation<\/code>, etc.).<\/li>\n\n\n\n<li><strong>Path:<\/strong> Hier wird festgelegt, wo die Script-Datei gespeichert wird. Der Standardpfad neben der Scene ist f\u00fcr den Anfang gut. Gib dem Script gleich den passenden Namen <code>player.gd<\/code>, da das sp\u00e4ter unser Spieler sein soll. Die Endung <strong><code>.gd<\/code><\/strong> ist wichtig!<\/li>\n\n\n\n<li><strong>Template:<\/strong> Dies bestimmt, welcher Basis-Code im Script enthalten sein soll. W\u00e4hle hier <strong>&#8222;Node&#8220;<\/strong>. Das ist eine gute Vorlage, die die grundlegenden Funktionen (<code>_ready<\/code>, <code>_process<\/code>) enth\u00e4lt, die man oft braucht.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Klicke auf <strong>&#8222;Create&#8220;<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>Godot wechselt nun automatisch zum Script Editor (der <strong>&#8222;Script&#8220;<\/strong>-Tab oben im Viewport wird aktiv) und du siehst den generierten Basis-Code f\u00fcr dein Script.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Das Script-Template verstehen<\/h3>\n\n\n\n<p>Im Script Editor siehst du folgenden Code:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:python decode:true \" >extends Sprite2D\n# Called when the node enters the scene tree for the first time.\nfunc _ready():\n    pass # Replace with function body.\n# Called every frame. 'delta' is the elapsed time since the previous frame.\nfunc _process(delta):\n    pass # Replace with function body.<\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>extends Sprite2D<\/code>: Diese Zeile teilt Godot mit, dass dieses Script die Funktionalit\u00e4t eines <code>Sprite2D<\/code> erweitert (es erbt von ihm). Das ist entscheidend, da das Script dadurch direkten Zugriff auf alle Eigenschaften und Methoden des <code>Sprite2D<\/code> Nodes hat, an den es angeh\u00e4ngt ist.<\/li>\n\n\n\n<li><code>func _ready():<\/code>: Dies ist eine spezielle Funktion, die Godot aufruft, sobald der Node und alle seine Children in der aktiven Scene bereit sind. Sie wird nur einmal aufgerufen, wenn die Scene gestartet wird. Perfekt f\u00fcr Initialisierungen, die einmalig zu Beginn des Spiels oder Scene-Starts ausgef\u00fchrt werden sollen.<\/li>\n\n\n\n<li><code>func _process(delta):<\/code>: Dies ist eine weitere spezielle Funktion, die Godot in jedem Frame deines Spiels aufruft. Hier kommt die Hauptspiellogik rein, die st\u00e4ndig aktualisiert werden muss (Bewegung, Animationen, etc.). <code>delta<\/code> ist die Zeit in Sekunden, die seit dem letzten Frame vergangen ist \u2013 sehr n\u00fctzlich f\u00fcr zeitbasierte, fl\u00fcssige Bewegungen unabh\u00e4ngig von der Bildrate des Spiels.<\/li>\n\n\n\n<li><code>pass<\/code>: Das ist ein Platzhalter in GDScript (und Python), der einfach &#8222;tue nichts&#8220; bedeutet. Er ist da, damit die Funktion syntaktisch korrekt ist, auch wenn sie leer ist.<\/li>\n<\/ul>\n\n\n\n<p><strong>Tipp:<\/strong> Wenn du wie ich aus der objektorientierten Programmierung kommst, m\u00f6chtest du dem Script vermutlich einen passenden Namen geben. Dazu erg\u00e4nzt du einfach <code>class_name<\/code> Name vor <code>extends<\/code>. Um den \u00dcberblick zu behalten achte ich darauf, dass der Node in der Scene, die Script-Datei und das Script den gleichen Namen haben:<\/p>\n\n\n\n<p>\u00a0<img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"278\" class=\"wp-image-574\" style=\"width: 650px;\" src=\"https:\/\/staratnight.de\/blog\/wp-content\/uploads\/2025\/05\/grafik.png\" alt=\"\" srcset=\"https:\/\/staratnight.de\/blog\/wp-content\/uploads\/2025\/05\/grafik.png 1011w, https:\/\/staratnight.de\/blog\/wp-content\/uploads\/2025\/05\/grafik-300x128.png 300w, https:\/\/staratnight.de\/blog\/wp-content\/uploads\/2025\/05\/grafik-768x329.png 768w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: Dem Sprite eine Bewegung hinzuf\u00fcgen (Rotation)<\/h3>\n\n\n\n<p>Lass uns das Script \u00e4ndern, damit sich der Sprite dreht. Wir tun dies in der <code>_process<\/code>-Funktion, da die Drehung st\u00e4ndig aktualisiert werden soll.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>L\u00f6sche das <code>pass<\/code> unter der Zeile <code>func _process(delta):<\/code>.<\/li>\n\n\n\n<li>F\u00fcge die folgende Zeile direkt unter <code>func _process(delta):<\/code> ein (achte auf die Einr\u00fcckung! In GDScript ist die Einr\u00fcckung wichtig, meist 4 Leerzeichen oder ein Tab):<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:default decode:true \" >func _process(delta):\n\trotation_degrees += 45 * delta<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Erkl\u00e4rung der Codezeile:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>rotation_degrees<\/code>: Das ist die Eigenschaft des <code>Sprite2D<\/code> (geerbt von <code>Node2D<\/code>), die den aktuellen Rotationswinkel des Nodes in Grad speichert. Da unser Script von <code>Sprite2D<\/code> (<code>extends Sprite2D<\/code>) erbt, k\u00f6nnen wir direkt auf diese Eigenschaft zugreifen.<\/li>\n\n\n\n<li><code>+=<\/code>: &#8222;Addieren und zuweisen&#8220;, kennt man<\/li>\n\n\n\n<li><code>45<\/code>: Dies ist die Geschwindigkeit der Drehung in Grad pro Sekunde. Wir wollen, dass sich der Sprite um 45 Grad pro Sekunde dreht.<\/li>\n\n\n\n<li><code>* delta<\/code>: Dies ist entscheidend f\u00fcr die Synchronisation! <code>delta<\/code> ist die Zeit, die seit dem letzten Frame vergangen ist (oft ein sehr kleiner Wert, wie 0.016 f\u00fcr 60 FPS). Indem wir die gew\u00fcnschte Drehgeschwindigkeit (<code>45<\/code>) mit <code>delta<\/code> multiplizieren, stellen wir sicher, dass die Drehung unabh\u00e4ngig davon erfolgt, wie schnell oder langsam der Computer die Frames verarbeitet. Wenn der Frame l\u00e4nger dauert (z.B. bei niedriger FPS), wird <code>delta<\/code> gr\u00f6\u00dfer, und der Sprite dreht sich in diesem Frame weiter, um die Geschwindigkeit pro Sekunde konstant zu halten.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 3: Script speichern und Scene ausf\u00fchren<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Speichere dein Script:\u00a0 <strong>File<\/strong> -> <strong>Save<\/strong> oder dr\u00fccke Strg + S.<\/li>\n\n\n\n<li>F\u00fchre die Scene erneut aus: Klicke auf\u00a0<strong>&#8222;Run Current Scene&#8220;<\/strong> (F6) oder\u00a0<strong>&#8222;Run Project&#8220;<\/strong> (F5).<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Ergebnis:<\/h4>\n\n\n\n<p>Du siehst jetzt ein neues Fenster, in dem das Godot-Logo rotiert. Du hast gerade dein erstes St\u00fcck Logik in GDScript geschrieben und ausgef\u00fchrt!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Dein n\u00e4chster Schritt<\/h3>\n\n\n\n<p>Sehr gut, du hast gelernt, wie man ein Script an einen Node anh\u00e4ngt, das GDScript-Template versteht und einen Sprite zum Rotieren bringt.<\/p>\n\n\n\n<p>Als n\u00e4chstes k\u00fcmmern wir uns um die Input-Verarbeitung, damit du den Sprite mit der Tastatur steuern kannst.&nbsp;<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nachdem du gelernt hast, Scenes und Nodes zu strukturieren und ihnen visuelle Elemente hinzuzuf\u00fcgen, ist es an der Zeit, ihnen Leben einzuhauchen! In&hellip;<\/p>\n","protected":false},"author":2,"featured_media":629,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33],"tags":[35,39,34],"class_list":["post-573","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-godot","tag-2d-game","tag-gdscript","tag-godot"],"_links":{"self":[{"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/posts\/573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/comments?post=573"}],"version-history":[{"count":7,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/posts\/573\/revisions"}],"predecessor-version":[{"id":612,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/posts\/573\/revisions\/612"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/media\/629"}],"wp:attachment":[{"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/media?parent=573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/categories?post=573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/tags?post=573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}