{"id":583,"date":"2025-06-05T09:00:00","date_gmt":"2025-06-05T07:00:00","guid":{"rendered":"https:\/\/staratnight.de\/blog\/?p=583"},"modified":"2025-06-01T16:32:02","modified_gmt":"2025-06-01T14:32:02","slug":"kollisionserkennung","status":"publish","type":"post","link":"https:\/\/staratnight.de\/blog\/kollisionserkennung\/","title":{"rendered":"Kollisionserkennung"},"content":{"rendered":"\n<p>Nachdem wir unseren <code>Sprite2D<\/code> mit einem Script zum Rotieren gebracht und ihm eine grundlegende Bewegung \u00fcber Input Actions verliehen haben, ist es Zeit f\u00fcr den n\u00e4chsten wichtigen Schritt: <strong>Kollisionserkennung<\/strong>.<\/p>\n\n\n\n<p>In den meisten Spielen m\u00fcssen Objekte erkennen, wann sie sich ber\u00fchren oder \u00fcberlappen. Das ist n\u00f6tig f\u00fcr Dinge wie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unser Player st\u00f6\u00dft gegen eine Wand.<\/li>\n\n\n\n<li>Eine Kugel trifft einen Gegner.<\/li>\n\n\n\n<li>Unser Player sammelt einen Gegenstand auf.<\/li>\n\n\n\n<li>Ein Charakter tritt auf eine Druckplatte.<\/li>\n<\/ul>\n\n\n\n<p>Godot handhabt Kollisionen und Physik mit speziellen <strong>Physics Bodies<\/strong> <strong>Nodes<\/strong>. Diese Nodes haben die F\u00e4higkeit, mit anderen Physik-K\u00f6rpern zu interagieren.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Die wichtigsten 2D Physics Body Nodes<\/h3>\n\n\n\n<p>Die wichtigsten 2D Physics Body Nodes sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>StaticBody2D<\/strong>: F\u00fcr Objekte, die sich nicht bewegen sollen (W\u00e4nde, Boden, unbewegliche Hindernisse). Sie reagieren auf Kollisionen, bewegen sich aber selbst nicht.<\/li>\n\n\n\n<li><strong>RigidBody2D<\/strong>: F\u00fcr Objekte, die komplett von der Physik-Engine simuliert werden (z.B. eine Kiste, die f\u00e4llt, ein Ball, der rollt). Wir steuern sie nicht direkt \u00fcber die Position, sondern \u00fcber Kr\u00e4fte oder Impulse.<\/li>\n\n\n\n<li><strong>CharacterBody2D<\/strong>: Speziell f\u00fcr von Spieler:innen gesteuerte Charaktere entwickelt. Wir steuern die Bewegung direkt (wie wir es tun), und der Body k\u00fcmmert sich darum, auf Kollisionen mit <code>StaticBody2D<\/code>s oder <code>RigidBody2D<\/code>s zu reagieren (z.B. stoppen vor einer Wand, an einer Schr\u00e4ge entlangrutschen).<\/li>\n\n\n\n<li><strong>Area2D<\/strong>: Dient nicht f\u00fcr solide Kollisionen, sondern nur zur Erkennung von \u00dcberlappungen (Detection). N\u00fctzlich f\u00fcr Trigger-Zonen oder das Einsammeln von Objekten (wenn der Spieler:in eine <code>Area2D<\/code> betritt, kann etwas passieren).<\/li>\n<\/ul>\n\n\n\n<p>Ein Physics Body Node allein hat noch keine Form f\u00fcr die Kollision. Du musst ihm Child Nodes hinzuf\u00fcgen, die die Kollisionsform definieren. Das sind meist <strong>CollisionShape2D<\/strong> (mit einer einfachen Form wie Rechteck, Kreis, Kapsel) oder <strong>CollisionPolygon2D<\/strong> (f\u00fcr komplexere, polygonale Formen).<\/p>\n\n\n\n<p>Da unser Sprite ein vom Spieler:in gesteuerter Charakter werden soll, ist <code>CharacterBody2D<\/code> der am besten geeignete Node. Wir werden die Scene leicht umbauen m\u00fcssen, um ihn als Root zu verwenden und unsere Bewegung in seinem Script umzusetzen. Der Vorteil: <code>CharacterBody2D<\/code> hat eingebaute Funktionen (<code>move_and_slide<\/code>), die Bewegung und Kollisionsreaktion in einem Schritt erledigen.<\/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: Eine neue Scene f\u00fcr den Player erstellen<\/h3>\n\n\n\n<p>Es ist best-practice, den Spieler:in (und eigentlich alle Objekte) in einer eigenen Scene zu definieren und diese dann in der Haupt-Level-Scene zu instanziieren.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Gehe im Men\u00fc auf <strong>Scene<\/strong> -> <strong>New Scene<\/strong> (Strg + N).<\/li>\n\n\n\n<li>Klicke auf &#8222;<strong>Other Node<\/strong>&#8220; und w\u00e4hle <strong>CharacterBody2D<\/strong> als Root Node und klicke <strong>Create<\/strong>.<\/li>\n\n\n\n<li>Benenne den Root Node im Scene Dock um zu <strong>Player<\/strong> (Rechtsklick auf den Node -> Rename, oder F2 dr\u00fccken).<\/li>\n\n\n\n<li>Speichere diese neue Scene: <strong>Scene<\/strong> -> <strong>Save Scene<\/strong> (Strg + S). Nenne sie z.B. <code>player.tscn<\/code> und speichere sie im Projekt-Root (oder lege einen neuen Ordner <code>scenes<\/code> an und speichere sie dort, was sp\u00e4ter ordentlicher ist &#8211; ich gehe im Folgenden davon aus).<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: Visuelle Darstellung und Kollisionsform hinzuf\u00fcgen<\/h3>\n\n\n\n<p>Ein <code>CharacterBody2D<\/code> ben\u00f6tigt Child Nodes, um sichtbar zu sein und eine Kollisionsform zu erhalten. Wir f\u00fcgen unserem <code>Player<\/code> jetzt einen <code>Sprite2D<\/code> f\u00fcr die Grafik und einen <code>CollisionShape2D<\/code> f\u00fcr die Kollision hinzu.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Stelle sicher, dass du im Scene Dock den <strong>Player<\/strong> (<code>CharacterBody2D<\/code>) Node ausgew\u00e4hlt hast.<\/li>\n\n\n\n<li>Klicke auf den Button <strong>&#8222;+&#8220;<\/strong> (Child Node hinzuf\u00fcgen) oberhalb des Scene Trees.<\/li>\n\n\n\n<li>Suche in der Liste nach <strong>Sprite2D<\/strong>, w\u00e4hle ihn aus und klicke <strong>Create<\/strong>. Benenne ihn um in &#8222;Sprite&#8220;<\/li>\n\n\n\n<li>W\u00e4hle den neuen <code>Sprite2D<\/code> Node im Scene Dock aus. Gehe im Inspector zum Abschnitt <strong>&#8222;Texture&#8220;<\/strong> und lade die Datei <strong><code>icon.svg<\/code><\/strong> (Godot-Logo) als seine Texture.<\/li>\n\n\n\n<li>Klicke erneut auf den Button <strong>&#8222;+&#8220;<\/strong> (Child Node hinzuf\u00fcgen), w\u00e4hrend der <strong>Player<\/strong> Node noch ausgew\u00e4hlt ist.<\/li>\n\n\n\n<li>Suche in der Liste nach <strong>CollisionShape2D<\/strong>, w\u00e4hle ihn aus und klicke <strong>Create<\/strong>. Benne ihn um in &#8222;Collision&#8220;<\/li>\n\n\n\n<li>W\u00e4hle den neuen <code>CollisionShape2D<\/code> Node im Scene Dock aus. Im Inspector siehst du die Eigenschaft <strong>&#8222;Shape&#8220;<\/strong>, die momentan &#8222;&lt;empty>&#8220; ist.<\/li>\n\n\n\n<li>Klicke auf <strong>&#8222;&lt;empty>&#8220;<\/strong> neben &#8222;Shape&#8220; und w\u00e4hle im Dropdown-Men\u00fc <strong>&#8222;New RectangleShape2D&#8220;<\/strong>.<\/li>\n\n\n\n<li>Godot erstellt eine neue Form. Wechsel auf den Viewport (oben auf &#8222;2D&#8220; klicken). Hier siehst du nun die Kollisionsform als blaues Rechteck im Zentrum des Godot-Logos.\u00a0<\/li>\n\n\n\n<li>Ziehe die Ankerpunkte des Rechtecks im Viewport so, dass die Kollisionsform das Godot-Logo umschlie\u00dft.\u00a0<\/li>\n<\/ol>\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 an den CharacterBody2D anh\u00e4ngen<\/h3>\n\n\n\n<p>Jetzt h\u00e4ngen wir unser Script an den <code>Player<\/code> Node, um ihm Logik zu verleihen. Dieses Script wird die Bewegung des Players steuern und mit Kollisionen umgehen.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>W\u00e4hle im Scene Dock den Root Node <strong>Player<\/strong> (<code>CharacterBody2D<\/code>) aus.<\/li>\n\n\n\n<li>Suche im Inspector ganz unten nach &#8222;<em>Script<\/em>&#8220; Klicke auf &#8222;&lt;empty>&#8220; und w\u00e4hle <strong>&#8222;Load&#8230;&#8220;<\/strong>.<\/li>\n\n\n\n<li>Es \u00f6ffnet sich ein Fenster. Suche das Script &#8222;Player.gd&#8220; (vermutlich im Ordner scenes zu finden) und w\u00e4hle es aus.<\/li>\n\n\n\n<li>Klicke <strong>&#8222;Open&#8220;<\/strong>.<\/li>\n\n\n\n<li>Neben dem Node &#8222;<strong>Player<\/strong>&#8220; im Node-Dock erscheint nun eine Pergamentrolle. Klicke darauf und der Code-Editor \u00f6ffnet sich.<\/li>\n<\/ol>\n\n\n\n<p>Dein <code>player.gd<\/code> Script sollte jetzt so aussehen:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:python decode:true \" >class_name Player extends CharacterBody2D\nvar speed = 200 # Einheit: Pixel pro Sekunde\n# Called when the node enters the scene tree for the first time.\nfunc _ready():\n    pass\n# Called every frame. 'delta' ist die Zeit seit dem letzten Frame.\nfunc _process(delta):\n    # Rotation (bleibt vorerst hier, da visuell)\n    rotation_degrees += 45 * delta\n    # Bewegung Input verarbeiten\n    var direction = Vector2.ZERO # Wir erzeugen einen Vektor (0,0) f\u00fcr die Bewegungsrichtung\n    if Input.is_action_pressed(\"move_right\"):\n        direction.x += 1\n    if Input.is_action_pressed(\"move_left\"):\n        direction.x -= 1\n    if Input.is_action_pressed(\"move_down\"):\n        direction.y += 1\n    if Input.is_action_pressed(\"move_up\"):\n        direction.y -= 1\n    if direction.length() &gt; 0:\n        direction = direction.normalized()\n    # HIER kommt gleich der neue Physik-Code hin\n    # Die Bewegung mit move_and_slide() geh\u00f6rt in _physics_process<\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Aufr\u00e4umen: Alte Dateien l\u00f6schen<\/h3>\n\n\n\n<p>Da wir jetzt eine saubere <code>player.tscn<\/code> erstellt und unseren Player von Grund auf neu strukturiert haben, brauchen wir die alte Scene <code>main_scene.tscn<\/code> nicht mehr, die wir zuvor f\u00fcr unser Test-Sprite verwendet haben.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Gehe ins <strong>Filesystem Dock<\/strong> (links unten).<\/li>\n\n\n\n<li>Klicke mit der rechten Maustaste auf <code>main_scene.tscn<\/code> und w\u00e4hle <strong>&#8222;Delete&#8220; und<\/strong>\u00a0Best\u00e4tige die L\u00f6schung.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 4: Eine Welt-Scene erstellen und den Player instanziieren<\/h3>\n\n\n\n<p>Wir brauchen eine Scene, in der unser Player &#8222;lebt&#8220; und mit anderen Objekten interagieren kann. Dies wird unsere Haupt-Spielwelt sein.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Erstelle eine neue Scene (Strg + N).<\/li>\n\n\n\n<li>Klicke auf &#8222;<strong>Other Node<\/strong>&#8220; und w\u00e4hle einen generischen\u00a0 <strong>Node<\/strong> als Root Node und klicke <strong>Create<\/strong>.<\/li>\n\n\n\n<li>Benenne den Root Node um in <strong>World<\/strong>.<\/li>\n\n\n\n<li>Speichere diese Scene als <code>world.tscn<\/code> im scene-Ordner.<\/li>\n\n\n\n<li>Instanziiere deine <code>player.tscn<\/code> Scene in die World-Scene (zieh die Datei <code>player.tscn<\/code> aus dem Filesystem Dock auf den <code>World<\/code> Node im Scene Dock). Du siehst jetzt <strong>Player<\/strong> als Child von <strong>World<\/strong>.<\/li>\n\n\n\n<li>Wechsel auf den Viewport (2D) und du siehst den Player in der World.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 5: Eine Wand hinzuf\u00fcgen (StaticBody2D)<\/h3>\n\n\n\n<p>Jetzt f\u00fcgen wir ein unbewegliches Objekt hinzu, mit dem der Player kollidieren kann \u2013 eine Wand.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Stelle sicher, dass du die Scene <code>world.tscn<\/code> ge\u00f6ffnet hast.<\/li>\n\n\n\n<li>W\u00e4hle im Scene Dock den Root Node <strong>World<\/strong> aus.<\/li>\n\n\n\n<li>Klicke auf den <strong>&#8222;+&#8220;<\/strong> Button (Child Node hinzuf\u00fcgen).<\/li>\n\n\n\n<li>Suche und w\u00e4hle <strong>StaticBody2D<\/strong>. Klicke <strong>Create<\/strong>. Benenne ihn um, z.B. in <strong>Wall<\/strong>.<\/li>\n\n\n\n<li>F\u00fcge dem <strong>Wall<\/strong> (<code>StaticBody2D<\/code>) einen <strong>CollisionShape2D<\/strong> als Child hinzu (w\u00e4hle Wall, klicke &#8222;+&#8220;, suche CollisionShape2D). Nenne ihn &#8222;Collision&#8220;.<\/li>\n\n\n\n<li>W\u00e4hle den <code>CollisionShape2D<\/code> der Wand aus und erstelle im Inspector eine <strong>&#8222;New RectangleShape2D&#8220;<\/strong> als Shape.<\/li>\n\n\n\n<li>Passe die Gr\u00f6\u00dfe und Position dieser Wand-Kollisionsform im Viewport an, um eine Wand zu erstellen (z.B. einen langen, schmalen Block). Platziere sie so, dass dein Player sp\u00e4ter dagegen laufen kann.<\/li>\n\n\n\n<li>Um die Wand sichtbar zu machen,\u00a0 w\u00e4hle den <strong>Wall-Node<\/strong> (<code>StaticBody2D<\/code>) aus, f\u00fcge einen <strong>ColorRect<\/strong> Node als Child hinzu. Passe die Gr\u00f6\u00dfe des <code>ColorRect<\/code> im Inspector unter <strong>&#8222;Rect&#8220;<\/strong> -> <strong>&#8222;Size&#8220;<\/strong> an, damit er dieselbe Gr\u00f6\u00dfe hat wie deine Kollisionsform. W\u00e4hle eine Farbe unter <strong>&#8222;Color&#8220;<\/strong> im Inspector.<\/li>\n\n\n\n<li><strong>Achtung<\/strong>: Hier kommt der fr\u00fchere Hinweis zum Tragen, dass der Viewport gew\u00f6hnungsbed\u00fcrftig in der Bedienung ist.\n<ul class=\"wp-block-list\">\n<li>Zum Verschieben w\u00e4hle &#8222;Move&#8220; (W).<\/li>\n\n\n\n<li>Wenn du die ganze Wall, samt Collision und ColorRect verschieben m\u00f6chtest, achte darauf, dass im Node Dock <strong>Wall<\/strong> ausgew\u00e4hlt ist.<\/li>\n\n\n\n<li>Zum \u00c4ndern der Gr\u00f6\u00dfe, w\u00e4hle das Objekt aus, dessen Gr\u00f6\u00dfe du \u00e4ndern m\u00f6chtest und nutze den &#8222;Select Mode&#8220; (Q).\u00a0 &#8222;Scale&#8220; (S) verh\u00e4lt sich f\u00fcr diesen Fall nicht gut.<\/li>\n\n\n\n<li>Zum Pr\u00fcfen: klicke auf\u00a0<strong>ColorRect<\/strong> und pr\u00fcfe im Inspector, dass die Position 0,0 ist\n<ul class=\"wp-block-list\">\n<li>Ist das nicht der Fall, befindet sich die Wall &#8211; der Parent Node &#8211; woanders.<\/li>\n\n\n\n<li>Setze ihn die Position auf 0,0 und verschiebe die Wall als Ganzes. Das erspart dir sp\u00e4ter Kopfschmerzen \ud83d\ude04<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Speichere die Scene <code>world.tscn<\/code> (Strg + S).<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 6: Bewegungslogik in <code>_physics_process<\/code> verschieben und <code>move_and_slide()<\/code> nutzen<\/h3>\n\n\n\n<p>Um eine reibungslose Kollisionserkennung zu gew\u00e4hrleisten, ist es wichtig, die Physik- und Bewegungslogik in der Funktion <code>_physics_process(delta)<\/code> zu verarbeiten, da diese Funktion mit einer festen Frequenz (Physik-Tick) aufgerufen wird, unabh\u00e4ngig von der Framerate. Die <code>_process(delta)<\/code>-Funktion ist eher f\u00fcr visuelle Updates gedacht.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u00d6ffne dein <code>player.gd<\/code> Script.<\/li>\n\n\n\n<li>Schneide die Bewegungslogik (alles von <code>var direction = ...<\/code> bis <code>position += ...<\/code>) aus der <code>_process(delta)<\/code> Funktion aus.<\/li>\n\n\n\n<li>F\u00fcge die Funktion <code>_physics_process(delta):<\/code> hinzu (sie ist nicht standardm\u00e4\u00dfig im Template enthalten).<\/li>\n\n\n\n<li>F\u00fcge die Bewegungslogik (von <code>var direction = Vector2.ZERO<\/code> bis zur Zeile vor der alten <code>position += ...<\/code> Zeile) in die <code>_physics_process(delta)<\/code> Funktion ein.<\/li>\n\n\n\n<li>F\u00fcge am Ende der <code>_physics_process(delta)<\/code> Funktion die zwei wichtigen Zeilen hinzu: <code>velocity = direction * speed<\/code> und <code>move_and_slide()<\/code>.<\/li>\n<\/ol>\n\n\n\n<p>Dein <code>player.gd<\/code> Script sollte jetzt so aussehen:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:python decode:true \" >class_name Player extends CharacterBody2D\nvar speed = 200 # Einheit: Pixel pro Sekunde\n# Called when the node enters the scene tree for the first time.\nfunc _ready():\n    pass # Nichts Besonderes bei Start\n# Called every frame (f\u00fcr visuelle Updates)\nfunc _process(delta):\n    # Rotation bleibt hier\n    rotation_degrees += 45 * delta\n# Called on physics tick (f\u00fcr Physik und Bewegung mit Kollision)\nfunc _physics_process(delta):\n    # Bewegung Input verarbeiten\n    var direction = Vector2.ZERO\n    if Input.is_action_pressed(\"move_right\"):\n        direction.x += 1\n    if Input.is_action_pressed(\"move_left\"):\n        direction.x -= 1\n    if Input.is_action_pressed(\"move_down\"):\n        direction.y += 1\n    if Input.is_action_pressed(\"move_up\"):\n        direction.y -= 1\n    # Normalisieren bei diagonaler Bewegung\n    if direction.length() &gt; 0:\n        direction = direction.normalized()\n    # Setze den velocity Vektor des CharacterBody2D\n    # velocity ist eine Eigenschaft von CharacterBody2D\n    velocity = direction * speed # KEIN * delta hier! move_and_slide() nutzt delta intern mit velocity\n    # move_and_slide() f\u00fchrt die Bewegung aus und handhabt Kollisionen\n    # Es verschiebt den Body um velocity * delta und stoppt bei Kollisionen\n    move_and_slide()<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Wichtiger Unterschied: <code>velocity<\/code> und <code>move_and_slide()<\/code><\/h4>\n\n\n\n<p>Beachte, dass wir bei der Zuweisung zu <code>velocity<\/code> <strong>nicht<\/strong> mit <code>delta<\/code> multiplizieren (<code>velocity = direction * speed<\/code>). Die <code>move_and_slide()<\/code> Funktion macht das intern, basierend auf dem festen Physik-Tick. Sie nimmt die <code>velocity<\/code> Eigenschaft des <code>CharacterBody2D<\/code> und verwendet sie, um die Bewegung pro Frame zu berechnen, unter Ber\u00fccksichtigung von Kollisionen und der <code>delta<\/code>-Zeit des Physik-Ticks.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt 7: Speichern und Ausf\u00fchren<\/h3>\n\n\n\n<p>Nun ist es an der Zeit, unsere Kollisionserkennung in Aktion zu sehen!<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Speichere dein <code>player.gd<\/code> Script (Strg + S).<\/li>\n\n\n\n<li>Stelle sicher, dass die Scene <code>world.tscn<\/code> als Haupt-Scene eingestellt ist. Wenn nicht, dr\u00fccke F5 und w\u00e4hle sie aus, oder stelle es in den Project Settings ein (<code>Project<\/code> -> <code>Project Settings<\/code> -> <code>Application<\/code> -> <code>Run<\/code> -> <code>Main Scene<\/code>).<\/li>\n\n\n\n<li>F\u00fchre das Projekt aus (F5).<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Ergebnis:<\/h4>\n\n\n\n<p>Du siehst jetzt das rotierende Godot-Logo, das du mit den Tasten bewegen kannst. Wenn du versuchst, durch die Wand zu laufen, die du gezeichnet hast, stoppt dein Player davor. Die Rotation zeigt auch, dass die Kollisionen sauber an den Schnittkanten der Wall und des Players funktionieren.<\/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>Puh, du hast einen gro\u00dfen Schritt gemacht! Du hast jetzt die Grundlagen der <strong>Kollisionserkennung<\/strong> in Godot verstanden und implementiert. Wir haben gelernt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die verschiedenen <strong>Physics Body<\/strong>-Typen und ihre Anwendungsbereiche.<\/li>\n\n\n\n<li>Die Notwendigkeit von <strong>CollisionShape2D<\/strong> Nodes zur Definition der Kollisionsform.<\/li>\n\n\n\n<li>Das Konzept des <strong>CharacterBody2D<\/strong> und die Funktion <strong><code>move_and_slide()<\/code><\/strong> f\u00fcr vom Spieler:in gesteuerte Bewegung mit Kollisionsbehandlung.<\/li>\n\n\n\n<li>Wie man Szenen ineinander <strong>instanziiert<\/strong>, um komplexe Spielwelten aufzubauen.<\/li>\n\n\n\n<li>Den entscheidenden Unterschied zwischen den Funktionen <strong><code>_process(delta)<\/code><\/strong> (f\u00fcr visuelle Updates) und <strong><code>_physics_process(delta)<\/code><\/strong> (f\u00fcr Physik und Bewegung).<\/li>\n<\/ul>\n\n\n\n<p>Als N\u00e4chstes werden wir das <strong>Signalsystem<\/strong> von Godot detailliert beleuchten. Dieses leistungsstarke System erm\u00f6glicht es Nodes, miteinander zu kommunizieren, ohne voneinander wissen zu m\u00fcssen \u2013 ein Schl\u00fcsselkonzept f\u00fcr sauberen und erweiterbaren Code in Godot.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nachdem wir unseren Sprite2D mit einem Script zum Rotieren gebracht und ihm eine grundlegende Bewegung \u00fcber Input Actions verliehen haben, ist es Zeit&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,41,34,40,42],"class_list":["post-583","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-godot","tag-2d-game","tag-collision","tag-godot","tag-kollision","tag-physics"],"_links":{"self":[{"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/posts\/583","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=583"}],"version-history":[{"count":3,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/posts\/583\/revisions"}],"predecessor-version":[{"id":615,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/posts\/583\/revisions\/615"}],"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=583"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/categories?post=583"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/staratnight.de\/blog\/wp-json\/wp\/v2\/tags?post=583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}