<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ziva</title>
    <description>The latest articles on Forem by Ziva (@ziva).</description>
    <link>https://forem.com/ziva</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3845272%2F6667c5de-b09a-4a44-b3a4-19819c554824.png</url>
      <title>Forem: Ziva</title>
      <link>https://forem.com/ziva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ziva"/>
    <language>en</language>
    <item>
      <title>VirtualJoystick in Godot 4.7: Endlich ein nativer Touchscreen-Stick</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Fri, 01 May 2026 17:41:44 +0000</pubDate>
      <link>https://forem.com/ziva/virtualjoystick-in-godot-47-endlich-ein-nativer-touchscreen-stick-1enb</link>
      <guid>https://forem.com/ziva/virtualjoystick-in-godot-47-endlich-ein-nativer-touchscreen-stick-1enb</guid>
      <description>&lt;p&gt;Bis vor kurzem hattest du in Godot zwei Optionen, wenn du einen virtuellen Joystick auf dem Smartphone wolltest: Plugin installieren oder selbst bauen. Beides hatte den gleichen Effekt: Edge Cases mit Multitouch, Resolution-Scaling von Hand, und am Ende eine Klasse mit 200 Zeilen, die du bei jedem Engine-Update neu testen musstest.&lt;/p&gt;

&lt;p&gt;Mit &lt;a href="https://godotengine.org/article/dev-snapshot-godot-4-7-beta-1/" rel="noopener noreferrer"&gt;Godot 4.7 beta 1&lt;/a&gt; (24. April 2026) ist das vorbei. Der neue &lt;code&gt;VirtualJoystick&lt;/code&gt;-Knoten ist Teil der Engine, hat drei Modi und fügt sich sauber ins Action-Mapping-System ein.&lt;/p&gt;

&lt;h2&gt;
  
  
  Das Problem, das &lt;code&gt;TouchScreenButton&lt;/code&gt; nicht gelöst hat
&lt;/h2&gt;

&lt;p&gt;Godot hatte schon vorher einen Knoten namens &lt;code&gt;TouchScreenButton&lt;/code&gt; für mobile Steuerungen. Das Problem: Er erbt von &lt;code&gt;Node2D&lt;/code&gt;. Das klingt harmlos, ist es aber nicht. Es bedeutet, dass der Button keine Anchors verwenden kann, also nicht relativ zum Bildschirmrand positioniert werden kann.&lt;/p&gt;

&lt;p&gt;Der Reviewer Calinou hat es im Pull Request knapp formuliert: &lt;a href="https://github.com/godotengine/godot/pull/110933" rel="noopener noreferrer"&gt;"TouchScreenButton inherits from Node2D, which means it can't make use of anchors."&lt;/a&gt; Für ein Element, das auf jedem Display-Format ordentlich aussehen soll, ist das ein Showstopper.&lt;/p&gt;

&lt;p&gt;Im &lt;a href="https://github.com/godotengine/godot-proposals/issues/11192" rel="noopener noreferrer"&gt;ursprünglichen Proposal&lt;/a&gt; stand es so:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"When creating a mobile game, you often need a virtual joystick so the player can move around. However, this is nontrivial to implement correctly."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Das Resultat: Jedes mobile Godot-Projekt hatte entweder eine Asset-Library-Abhängigkeit oder eine selbst geschriebene Joystick-Klasse, die in vielen Fällen ein paar Edge Cases falsch handhabte. Multitouch-Tracking, Resolution-Scaling und das Verhalten beim Verlassen des Sticks sind die häufigsten Stolpersteine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was der neue &lt;code&gt;VirtualJoystick&lt;/code&gt; ist
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;VirtualJoystick&lt;/code&gt; erbt von &lt;code&gt;Control&lt;/code&gt;. Damit funktionieren Anchors, &lt;code&gt;size_flags&lt;/code&gt;, &lt;code&gt;theme_override&lt;/code&gt;, alles was Control-Nodes können. Das ist der wichtige Unterschied zum alten &lt;code&gt;TouchScreenButton&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Der Knoten zeichnet sich prozedural, also nicht als Bitmap. Das bedeutet: Egal ob 1080p oder 4K-Tablet, der Stick sieht identisch scharf aus. Der Look lässt sich über Theme-Properties anpassen (Hintergrund, Knopf, Farben).&lt;/p&gt;

&lt;p&gt;Hinzu kommen vier Signale, die du im Editor verbinden kannst:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tapped&lt;/code&gt;: losgelassen, ohne dass der Stick bewegt wurde&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;released&lt;/code&gt;: der Finger hat den Bildschirm verlassen&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flicked&lt;/code&gt;: der Stick wurde aus der Deadzone heraus bewegt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flick_canceled&lt;/code&gt;: ein Flick wurde initiiert, aber wieder zurückgezogen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das ist mehr als die meisten Plugin-Implementierungen anbieten. Vor allem &lt;code&gt;tapped&lt;/code&gt; ist nützlich: Damit lässt sich der Joystick auch als Action-Button verwenden, wenn der Spieler nur kurz tippt statt zu schieben.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die drei Modi: Fixed, Dynamic, Following
&lt;/h2&gt;

&lt;p&gt;Hier ist der Punkt, an dem die meisten Tutorials oberflächlich werden. Die drei Modi bestimmen, wie sich der Stick beim Berühren verhält.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;JOYSTICK_FIXED&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Der Stick bleibt da, wo du ihn platziert hast. Klassisch, simpel, vorhersehbar. Wenn der Spieler nicht direkt auf den Stick tippt, passiert nichts.&lt;/p&gt;

&lt;p&gt;Use Case: Action-Spiele mit fester UI, bei denen der Stick immer sichtbar ist. Spieler gewöhnen sich an die Position.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;JOYSTICK_DYNAMIC&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Tippt der Spieler in den Bereich des Sticks (also die &lt;code&gt;size&lt;/code&gt;-Region des Control-Nodes), springt der Knopf zur Berührungsposition. Der Stick selbst bewegt sich nicht weiter über den Berührungspunkt hinaus.&lt;/p&gt;

&lt;p&gt;Use Case: Mehr Komfort als &lt;code&gt;FIXED&lt;/code&gt;, weil man nicht millimetergenau treffen muss. Gut für Mobile-Ports von Joypad-Spielen.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;JOYSTICK_FOLLOWING&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Wie &lt;code&gt;DYNAMIC&lt;/code&gt;, aber der Stick folgt dem Finger auch über die ursprüngliche Bounding-Box hinaus. Beim Loslassen springt er zurück.&lt;/p&gt;

&lt;p&gt;Use Case: Twin-Stick-Shooter und alles, wo der Spieler den Daumen wandern lässt. Das fühlt sich auf großen Displays am natürlichsten an.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modus&lt;/th&gt;
&lt;th&gt;Stick-Position&lt;/th&gt;
&lt;th&gt;Bewegung über Bounds&lt;/th&gt;
&lt;th&gt;Typischer Einsatz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JOYSTICK_FIXED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;unverändert&lt;/td&gt;
&lt;td&gt;nein&lt;/td&gt;
&lt;td&gt;klassische UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JOYSTICK_DYNAMIC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;springt zur Berührung&lt;/td&gt;
&lt;td&gt;nein&lt;/td&gt;
&lt;td&gt;Mobile-Ports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JOYSTICK_FOLLOWING&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;springt zur Berührung&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;td&gt;Twin-Stick&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Praktischer Setup-Code
&lt;/h2&gt;

&lt;p&gt;Im Editor legst du den &lt;code&gt;VirtualJoystick&lt;/code&gt; als Kind eines &lt;code&gt;CanvasLayer&lt;/code&gt; an, damit er nicht mit der Welt-Kamera scrollt. Dann mappst du die Richtungen auf Input-Actions und liest die Werte wie gewohnt aus.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;CharacterBody2D&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;move_speed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;200.0&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_physics_process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_delta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;input_dir&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;"move_left"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"move_right"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"move_up"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"move_down"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;velocity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input_dir&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;move_speed&lt;/span&gt;
    &lt;span class="n"&gt;move_and_slide&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das ist alles. Im &lt;code&gt;VirtualJoystick&lt;/code&gt;-Inspector trägst du &lt;code&gt;move_left&lt;/code&gt;, &lt;code&gt;move_right&lt;/code&gt;, &lt;code&gt;move_up&lt;/code&gt; und &lt;code&gt;move_down&lt;/code&gt; als Action-Properties ein. Der Knoten triggert die Actions automatisch mit der entsprechenden Stärke (zwischen 0.0 und 1.0). Dein Spiel-Code muss nichts vom Joystick wissen, das ist plattform-agnostisch und funktioniert auch mit Gamepad oder Tastatur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was nicht drin ist (und warum)
&lt;/h2&gt;

&lt;p&gt;Bewusst weggelassen wurden zwei Features, die viele Plugins haben:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deadzone-Konfiguration im Knoten selbst.&lt;/strong&gt; Die Deadzone gehört zur Input-Action, nicht zum Joystick. Godot hat dafür schon ein Feld in den Project Settings unter "Input Map". Doppelte Konfiguration wäre nur eine Quelle für Bugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clamp-Zone.&lt;/strong&gt; Eine Zone, in der der Stick "gefangen" bleibt. Im &lt;a href="https://github.com/godotengine/godot-proposals/issues/11192" rel="noopener noreferrer"&gt;Original-Proposal&lt;/a&gt; als optional markiert, in der finalen Version dann doch rausgeflogen.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Beides sind Design-Entscheidungen, keine Lücken, die später gefüllt werden. Wenn du das brauchst, kannst du den Knoten beerben und es selbst hinzufügen, aber im Standard-Workflow ist es nicht notwendig.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vor 4.7 vs. ab 4.7
&lt;/h2&gt;

&lt;p&gt;Wenn du schon Mobile-Spiele in Godot baust, hast du wahrscheinlich eine eigene &lt;code&gt;VirtualJoystick.gd&lt;/code&gt;-Klasse oder ein Asset aus der Library. Die meisten dieser Implementierungen liegen bei 100 bis 300 Zeilen Code, abhängig davon, wie viele Edge Cases sie abdecken.&lt;/p&gt;

&lt;p&gt;Die &lt;a href="https://godotengine.org/asset-library/asset?filter=joystick" rel="noopener noreferrer"&gt;Godot Asset Library&lt;/a&gt; listet aktuell 20 konkurrierende Joystick-Plugins. Genau das ist das Problem, das eine native Lösung beendet: Du musst nicht mehr entscheiden, welches Plugin am wenigsten Bugs hat oder welches noch zu Godot 4.6 kompatibel ist. Der Knoten ist da, gewartet vom Engine-Team, und verschwindet beim nächsten Update nicht.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lohnt sich der Umstieg für Mobile-Projekte?
&lt;/h2&gt;

&lt;p&gt;Wenn dein Spiel auf Touchscreen zielt, ja. &lt;a href="https://www.game.de/en/record-revenue-with-mobile-games-in-germany/" rel="noopener noreferrer"&gt;Mobile Games erzielten 2024 in Deutschland Rekord-Umsätze von 3 Milliarden Euro&lt;/a&gt;, 63 Prozent mehr als 2019, und das Smartphone ist seit Jahren die meistgenutzte Gaming-Plattform hierzulande. Viele Indie-Studios machen einen Hybrid-Ansatz: Desktop-Release zuerst, dann Mobile-Port. Genau in diesem Mobile-Port-Schritt war Touchscreen-Steuerung bisher ein Tag Handarbeit.&lt;/p&gt;

&lt;p&gt;4.7 ist gerade in der Beta-Phase, der stabile Release wird in etwa zwei Monaten erwartet. Wenn du an einem Mobile-Spiel arbeitest, lohnt sich der Sprung früh genug, um den Joystick vor dem Launch zu testen. Klein, aber konkret.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>german</category>
      <category>deutsch</category>
    </item>
    <item>
      <title>Generación procedural en Godot 4: guía práctica con GDScript</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Tue, 28 Apr 2026 23:46:37 +0000</pubDate>
      <link>https://forem.com/ziva/generacion-procedural-en-godot-4-guia-practica-con-gdscript-bdn</link>
      <guid>https://forem.com/ziva/generacion-procedural-en-godot-4-guia-practica-con-gdscript-bdn</guid>
      <description>&lt;p&gt;La generación procedural es una de las características que más diferencia un juego indie en Steam de un juego de portfolio. Roguelikes, sandboxes, dungeon crawlers, todos dependen de algún sistema procedural. En Godot 4 hay tres patrones que cubren el 80 por ciento de los casos de uso, y aún así hay sutilezas que la mayoría de tutoriales pasan por alto.&lt;/p&gt;

&lt;p&gt;Voy a recorrer los tres patrones, las trampas reales que aparecen al implementarlos, y por qué los asistentes de IA tienden a generar código procedural que parece correcto pero produce mundos rotos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patrón 1: Generación basada en ruido (Perlin/Simplex)
&lt;/h2&gt;

&lt;p&gt;Godot 4 incluye &lt;code&gt;FastNoiseLite&lt;/code&gt; con varios tipos de ruido (Perlin, Simplex, Value, Cellular). Es el camino más corto para generar terrenos, mapas de calor, distribuciones de recursos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="k"&gt;onready&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;noise&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastNoiseLite&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_ready&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;noise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;noise_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastNoiseLite&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TYPE_SIMPLEX_SMOOTH&lt;/span&gt;
    &lt;span class="n"&gt;noise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;randi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;noise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;get_height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;noise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_noise_2d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La trampa principal: la frecuencia. Demasiado baja (0.001) y obtienes una superficie casi plana. Demasiado alta (0.5) y obtienes ruido aleatorio sin estructura. La mayoría de problemas de "mi terreno se ve raro" son problemas de frecuencia mal calibrada.&lt;/p&gt;

&lt;p&gt;Otra trampa común: usar &lt;code&gt;randi()&lt;/code&gt; como seed sin guardarla. Si quieres reproducibilidad (necesario para multiplayer y depuración), guarda la seed que usaste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patrón 2: Generación basada en celdas (cellular automata)
&lt;/h2&gt;

&lt;p&gt;Para cuevas, islas, distribuciones orgánicas, los autómatas celulares son superiores al ruido. El algoritmo clásico:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Llena una grilla aleatoriamente con piedra (1) y aire (0).&lt;/li&gt;
&lt;li&gt;Para N iteraciones: para cada celda, cuenta sus vecinos. Si tiene &amp;gt;= 4 vecinos sólidos, se vuelve sólida. Si no, se vuelve aire.&lt;/li&gt;
&lt;li&gt;Después de 4-5 iteraciones, los grupos pequeños desaparecen y emergen cuevas naturales.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;cellular_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;new_grid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;neighbors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;count_neighbors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;new_grid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;neighbors&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_grid&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trampa: la primera iteración necesita cuidado en los bordes. Si tu &lt;code&gt;count_neighbors&lt;/code&gt; no maneja los bordes correctamente, las cuevas pegadas al borde del mapa se rompen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patrón 3: BSP (Binary Space Partitioning)
&lt;/h2&gt;

&lt;p&gt;Para mazmorras estructuradas con habitaciones y pasillos, BSP es el estándar de la industria. Divides el mapa recursivamente en dos, paras cuando los rectángulos son del tamaño de una habitación, colocas una habitación en cada hoja, y conectas habitaciones con pasillos siguiendo la jerarquía del árbol.&lt;/p&gt;

&lt;p&gt;Este es el patrón más complicado de los tres, porque combina recursión, geometría 2D, y un grafo de conectividad. Es también donde más fallan los asistentes de IA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué la IA genera código procedural roto
&lt;/h2&gt;

&lt;p&gt;Cuando le pides a ChatGPT, Claude o Cursor que genere un sistema procedural en GDScript, suele producir código que compila y ejecuta, pero genera mundos visiblemente rotos. Las razones recurrentes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frecuencias de ruido sin calibrar.&lt;/strong&gt; El modelo elige un valor "estándar" (0.1) que solo funciona para escalas específicas. Si tu mapa es de 1000x1000 tiles, no va a verse bien con esa frecuencia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bucles sin guardas.&lt;/strong&gt; El cellular automata necesita un número fijo de iteraciones. La IA a veces escribe &lt;code&gt;while not stable:&lt;/code&gt; sin definir bien &lt;code&gt;stable&lt;/code&gt;, y el bucle nunca termina o termina muy pronto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manejo de bordes inconsistente.&lt;/strong&gt; Wrap, clamp, o ignorar son tres opciones válidas según el tipo de mundo. La IA mezcla las tres en el mismo proyecto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seed no guardada.&lt;/strong&gt; El código genera un mundo bonito una vez y luego nunca puedes reproducirlo. La IA omite el almacenamiento de la seed por defecto.&lt;/p&gt;

&lt;p&gt;Esto encaja con el patrón general de fallos silenciosos en código generado por IA. El &lt;a href="https://www.sonarsource.com/state-of-code-developer-survey-report.pdf" rel="noopener noreferrer"&gt;reporte Sonarsource State of Code 2026&lt;/a&gt; reporta que el 60 por ciento de los fallos en código generado por IA son "fallos silenciosos": código que compila, parece correcto, y produce resultados incorrectos. La generación procedural es un caso particularmente afectado, porque el "resultado correcto" es subjetivo (un mundo visualmente plausible) y no hay test unitario que lo capture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo verificar generación procedural
&lt;/h2&gt;

&lt;p&gt;Tres reglas prácticas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visualiza siempre.&lt;/strong&gt; No confíes en que un mundo "se ve bien" porque el código corre. Genera 10 mundos, mira los 10. Las trampas de calibración aparecen como "mundos demasiado parecidos" o "mundos demasiado caóticos."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guarda la seed que produjo el bug.&lt;/strong&gt; Cuando un mundo procedural se vea raro, copia la seed que lo generó al portapapeles. Sin la seed, no puedes reproducir el bug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usa herramientas que ejecuten el código en Godot.&lt;/strong&gt; Una clase emergente de herramientas (proyectos como &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; específicamente para Godot) ejecuta el código generado dentro del editor, observa el resultado, y reacciona cuando el mundo se ve roto. Eso cierra el bucle entre "el código compila" y "el código produce un mundo jugable."&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Los tres patrones (ruido, celular, BSP) cubren la mayoría de necesidades procedurales en juegos indie. Cada uno tiene trampas que la IA tiende a pasar por alto. La defensa más fuerte es siempre la misma: ejecuta el código en Godot, observa el resultado, no confíes en que "el código compila" significa "el mundo está bien."&lt;/p&gt;

&lt;p&gt;Para tu próximo proyecto procedural en Godot, empieza con &lt;code&gt;FastNoiseLite&lt;/code&gt; y calibra la frecuencia visualmente. Cuando necesites estructura (habitaciones, conectividad), pasa a BSP. Para orgánicos, autómatas celulares. Y guarda esa seed.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
      <category>gdscript</category>
      <category>programming</category>
    </item>
    <item>
      <title>KI-Tools in Godot 2026: Was funktioniert, was scheitert</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Tue, 28 Apr 2026 23:44:04 +0000</pubDate>
      <link>https://forem.com/ziva/ki-tools-in-godot-2026-was-funktioniert-was-scheitert-2o2b</link>
      <guid>https://forem.com/ziva/ki-tools-in-godot-2026-was-funktioniert-was-scheitert-2o2b</guid>
      <description>&lt;p&gt;Wer 2026 mit Godot anfängt und nach KI-Hilfe sucht, stößt auf ein Problem, das in Tutorials selten erwähnt wird: ChatGPT und Claude können GDScript zwar gut schreiben, aber sie wissen nicht, wie das Godot-Projekt strukturiert ist, das du gerade aufbaust. Sie raten. Manchmal richtig, oft daneben.&lt;/p&gt;

&lt;p&gt;Ich nutze KI-Tools seit Jahren beim Webentwicklung und seit etwa 8 Monaten in Godot. Die Erfahrung ist deutlich anders. Hier eine ehrliche Übersicht, was 2026 in Godot mit KI funktioniert und was nicht.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was funktioniert
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Boilerplate für gängige Patterns.&lt;/strong&gt; Ein Player-Controller mit &lt;code&gt;CharacterBody2D&lt;/code&gt;, Eingabebehandlung über &lt;code&gt;Input.get_axis()&lt;/code&gt;, Sprung-Logik mit Coyote-Time, all das schreiben generische KI-Tools korrekt. Wenn du ein Standard-Pattern willst, ist das schneller als selbst tippen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Erklärung von Engine-Features.&lt;/strong&gt; Wenn du nicht verstehst, was &lt;code&gt;_physics_process&lt;/code&gt; vs &lt;code&gt;_process&lt;/code&gt; macht, oder wann du &lt;code&gt;queue_free()&lt;/code&gt; statt &lt;code&gt;free()&lt;/code&gt; verwendest, sind LLMs eine sinnvolle Lernhilfe. Die Grundkonzepte sitzen ausreichend gut im Trainingsmaterial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GDScript-Syntax und Typen.&lt;/strong&gt; Godot 4.x Typing (&lt;code&gt;var hp: int = 100&lt;/code&gt;) wird korrekt gehandhabt. &lt;code&gt;@export&lt;/code&gt;-Annotationen, &lt;code&gt;@onready&lt;/code&gt;, das funktioniert in 95 Prozent der Fälle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refactoring von eigenen Skripten.&lt;/strong&gt; Ein vorhandenes Skript in mehrere Klassen aufteilen, Magic Numbers extrahieren, Funktionen umbenennen, das macht generische KI gut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was nicht funktioniert
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Signale, die zur Laufzeit gebunden werden.&lt;/strong&gt; Die KI sieht nur den Quellcode. Sie kann nicht überprüfen, ob ein &lt;code&gt;connect()&lt;/code&gt;-Aufruf zum Zeitpunkt der Emission noch gültig ist, ob der Receiver freigegeben wurde, ob die Verbindung doppelt existiert. Ein Großteil der "fast richtigen" Godot-Bugs sind Signal-Bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AnimationTree-Verkabelung.&lt;/strong&gt; Der &lt;code&gt;parameters/playback&lt;/code&gt;-Pfad ist ein String. Generische KI tippt diese Strings souverän falsch ab und merkt es nicht. Die Animation läuft einfach nicht. Kein Fehler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Szenenpfade in &lt;code&gt;load()&lt;/code&gt;.&lt;/strong&gt; Die KI nimmt an, dein Projekt sei strukturiert wie das erste Tutorial, das sie gelernt hat. Wenn deine &lt;code&gt;Player.tscn&lt;/code&gt; woanders liegt, gibt &lt;code&gt;load()&lt;/code&gt; &lt;code&gt;null&lt;/code&gt; zurück, und die KI merkt es nicht.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autoload-Referenzen.&lt;/strong&gt; &lt;code&gt;AudioManager.play("hit")&lt;/code&gt; setzt voraus, dass &lt;code&gt;AudioManager&lt;/code&gt; als Autoload registriert ist. KI-generierte Code überspringt diesen Check standardmäßig. Du bekommst NIL-Errors zur Laufzeit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plattform-spezifischer Export-Code.&lt;/strong&gt; Web-Export, Mobile-Export, Konsolen-Build-Konfigurationen sind in den Trainingsdaten unterrepräsentiert. Hier rät die KI sehr.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum das passiert
&lt;/h2&gt;

&lt;p&gt;Der zugrundeliegende Grund ist einfach: 60 Prozent der Fehler in KI-generiertem Code sind laut &lt;a href="https://www.sonarsource.com/state-of-code-developer-survey-report.pdf" rel="noopener noreferrer"&gt;Sonarsource State of Code Report 2026&lt;/a&gt; "stille Fehler". Code, der kompiliert, plausibel aussieht und in der Produktion das Falsche tut. In Godot ist "Produktion" der erste Druck auf F5.&lt;/p&gt;

&lt;p&gt;Die &lt;a href="https://stackoverflow.blog/2025/12/29/developers-remain-willing-but-reluctant-to-use-ai-the-2025-developer-survey-results-are-here/" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey 2025&lt;/a&gt; zeigt zudem: 84 Prozent der Entwickler nutzen KI, nur 29 Prozent vertrauen den Ergebnissen. Bei Godot-Devs ist das Vertrauensniveau noch niedriger, weil die Fehler stiller sind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was 2026 hilft
&lt;/h2&gt;

&lt;p&gt;Drei praktische Tipps, die wirklich Zeit sparen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run-then-paste statt paste-then-run.&lt;/strong&gt; Lass die KI Code generieren, paste ihn ein, drücke F5 BEVOR du committest. Das Output-Panel von Godot zeigt die meisten stillen Fehler innerhalb von Sekunden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;is_connected()&lt;/code&gt;-Guards bei &lt;code&gt;disconnect()&lt;/code&gt;.&lt;/strong&gt; Das ist die billigste Defensiv-Praxis, die du KI-Code hinzufügen kannst. Sie verhindert eine ganze Klasse von "signal not connected"-Fehlern beim Szenenwechsel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engine-bewusste KI-Tools, wo möglich.&lt;/strong&gt; Eine kleine, aber wachsende Klasse von Tools (Projekte wie &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; für Godot speziell) integriert sich direkt in den Godot-Editor. Der Agent kann die Szene laden, F5 drücken, die Ausgabe lesen, und reagieren, wenn das Signal nicht gefeuert hat. Das schließt die Lücke zwischen "Code sieht richtig aus" und "Code funktioniert."&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit für deutsche Godot-Entwickler
&lt;/h2&gt;

&lt;p&gt;Generische KI-Tools sind 2026 nicht überflüssig, aber sie sind nicht das Endgame. Die nächste Generation von Godot-Tools ist engine-aware, kennt die Szenenhierarchie, kann F5 drücken. Wenn du gerade mit KI-gestützter Godot-Entwicklung anfängst, würde ich empfehlen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generische LLMs für Konzepte und GDScript-Syntax verwenden.&lt;/li&gt;
&lt;li&gt;Kritische Engine-Pfade (Signale, AnimationTree, Autoloads) IMMER manuell testen.&lt;/li&gt;
&lt;li&gt;Ein engine-aware Tool ausprobieren, wenn du regelmäßig Godot-Code schreibst.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Die Stunden, die du beim Debuggen "fast richtigen" KI-Codes sparst, summieren sich schnell. Was ich als Faustregel gelernt habe: KI-Code, der nicht in der Engine ausgeführt wurde, ist KI-Code, dem du nicht trauen solltest.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
      <category>ai</category>
      <category>gdscript</category>
    </item>
    <item>
      <title>Testing Godot Code Is Harder Than Testing a Webapp. Here's What Helps.</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Tue, 28 Apr 2026 23:23:26 +0000</pubDate>
      <link>https://forem.com/ziva/testing-godot-code-is-harder-than-testing-a-webapp-heres-what-helps-5gb1</link>
      <guid>https://forem.com/ziva/testing-godot-code-is-harder-than-testing-a-webapp-heres-what-helps-5gb1</guid>
      <description>&lt;p&gt;If you've come from web development, you have muscle memory for testing. Spin up Jest, mock the database, hit the route, assert. Or use Playwright to drive a headless browser through a flow. CI runs the suite on every PR. You know the loop.&lt;/p&gt;

&lt;p&gt;Then you open a Godot project. The web testing playbook breaks in five places before you finish your morning coffee.&lt;/p&gt;

&lt;p&gt;I'm writing this because the gap between "AI wrote my Godot code" and "the code actually works" is mostly testing, and most of the testing tooling for Godot is one or two layers behind what web devs are used to. Here's what's different and what currently helps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Godot doesn't have a default headless test mode that just works
&lt;/h2&gt;

&lt;p&gt;A web project ships with a test framework on day one. Jest is built into Create React App. Vitest is the Vite default. You inherit a working test runner before you've written a line of business logic.&lt;/p&gt;

&lt;p&gt;A Godot project ships with the editor and &lt;code&gt;_ready()&lt;/code&gt;. There is no default test framework. The community standard, &lt;a href="https://github.com/bitwes/Gut" rel="noopener noreferrer"&gt;GUT (Godot Unit Testing)&lt;/a&gt;, is a third-party plugin you install yourself. It's good. It's also one of those "obvious in hindsight, surprising on day one" gaps when you arrive from a webdev background.&lt;/p&gt;

&lt;p&gt;There's also &lt;a href="https://github.com/chickensoft-games/GodotTestDriver" rel="noopener noreferrer"&gt;GodotTestDriver&lt;/a&gt; for integration tests, and Godot does support a &lt;code&gt;--headless&lt;/code&gt; mode for running scenes without a window. But none of this is wired up out of the box, and the headless mode has quirks: rendering-dependent code (anything that uses &lt;code&gt;Viewport.get_texture()&lt;/code&gt;, for example) silently produces empty results.&lt;/p&gt;

&lt;h2&gt;
  
  
  The state of your scene tree is invisible to most test runners
&lt;/h2&gt;

&lt;p&gt;Web tests deal with three kinds of state: the DOM, your store, and the database. All three are introspectable. You can &lt;code&gt;screen.getByRole('button')&lt;/code&gt;, you can read Redux state, you can &lt;code&gt;SELECT *&lt;/code&gt; from the test DB.&lt;/p&gt;

&lt;p&gt;Godot has a fourth kind: the scene tree. Nodes have parents. Signals connect nodes to other nodes. The active StateMachine state is buried inside an AnimationTree's &lt;code&gt;parameters/playback&lt;/code&gt; property. None of this surfaces in a stack trace. None of it is in a test database. You can write a unit test that verifies your signal-emitting function fires the signal, and still have a broken game because the receiving node was freed two frames earlier.&lt;/p&gt;

&lt;p&gt;This is the failure mode that bit me hardest moving from web to Godot: tests that pass in isolation, gameplay that breaks at runtime because the test runner doesn't know what the scene tree looked like when the bug happened.&lt;/p&gt;

&lt;p&gt;GodotTestDriver helps here by providing a &lt;code&gt;Fixture&lt;/code&gt; class that owns scene nodes during a test and tears them down cleanly. But you have to write integration tests that exercise actual scene behavior, not just unit tests that exercise pure functions. Most game logic is not pure functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most AI-generated Godot code never gets run before it ships
&lt;/h2&gt;

&lt;p&gt;The 2026 &lt;a href="https://www.sonarsource.com/state-of-code-developer-survey-report.pdf" rel="noopener noreferrer"&gt;Sonarsource State of Code report&lt;/a&gt; found that 60% of faults in AI-generated code are "silent failures." Code that compiles, looks right, and produces wrong results in production. The 2025 &lt;a href="https://stackoverflow.blog/2025/12/29/developers-remain-willing-but-reluctant-to-use-ai-the-2025-developer-survey-results-are-here/" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey&lt;/a&gt; shows trust in AI output dropped from 40% to 29%, with 66% of devs citing "almost-right" code as their top frustration.&lt;/p&gt;

&lt;p&gt;For a webdev, this hurts a little. Type-check catches some of it. Failing test catches more. The user-visible failure mode is a 500 error and a Sentry alert.&lt;/p&gt;

&lt;p&gt;For a Godot dev, the same code can ship without anything obvious going wrong. The build succeeds. The editor doesn't complain. You press Play, the scene loads, your character moves around. Then you realize the death animation isn't playing because the signal was connected to a node that gets freed before the signal fires. There's no exception. There's no log line. The gameplay is just slightly wrong.&lt;/p&gt;

&lt;p&gt;Pasting AI-generated code into Godot without running it in the engine first is the equivalent of merging an untested PR straight to production. Web devs would never do that. Godot devs do it constantly, because the tooling makes it the path of least resistance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What helps
&lt;/h2&gt;

&lt;p&gt;A few things narrow the gap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run a smoke test scene before pasting AI output.&lt;/strong&gt; Open the project, open the scene, press F5. If the AI's change broke node references or signal wiring, you'll see it in the output panel within seconds. This sounds obvious. It's also the thing most people skip because the dev/AI/dev/AI loop has too many context switches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add GUT and write integration tests for systems that touch the scene tree.&lt;/strong&gt; Pure-function tests are not enough for Godot. You need tests that load a scene, fire input, advance the frame, and assert on the resulting state. GUT supports this with &lt;code&gt;add_child_autofree()&lt;/code&gt; and the &lt;code&gt;await&lt;/code&gt; keyword for waiting on signals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use AI tools that integrate with the engine, not just the editor.&lt;/strong&gt; Most AI coding tools edit text files and stop. They have no view into the scene tree, no way to press Play, no read access to the Godot output panel. A small but growing class of tools (projects like &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; for Godot specifically) wire the AI agent to the engine itself, so the same model that writes the code can run the scene, watch the output, and react when a signal didn't fire. That's the part of the loop that closes the gap between "code looks right" and "code works."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat headless CI as a goal, not a starting point.&lt;/strong&gt; You will not have headless CI on day one of a Godot project. That's fine. Get to the point where you can press Play and watch a smoke test scene first. Build up to running tests on a CI runner with &lt;code&gt;--headless&lt;/code&gt; later. Web devs are used to that order being reversed; in Godot it's almost always smoke-test-first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest summary
&lt;/h2&gt;

&lt;p&gt;Game dev testing is harder than webapp testing in 2026. The frameworks are younger. The state model is more complex. The default failure mode is silent. AI-generated code raises the floor for syntax correctness and lowers the floor for runtime correctness in ways that are particularly bad for game projects, because game projects already had a runtime correctness problem.&lt;/p&gt;

&lt;p&gt;If you're a web dev experimenting with Godot and you're confused why your AI-assisted prototype keeps almost-but-not-quite working, this is most of the answer. The fix is upstream of the AI: better integration between the model writing the code and the engine running the code. The community is figuring this out in real time, and the tooling is improving fast.&lt;/p&gt;

&lt;p&gt;In the meantime, press Play before you commit.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>godot</category>
      <category>ai</category>
      <category>testing</category>
    </item>
    <item>
      <title>Domain-Specific AI Beats General AI on Niche Code. Here is Why.</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Fri, 24 Apr 2026 21:34:02 +0000</pubDate>
      <link>https://forem.com/ziva/domain-specific-ai-beats-general-ai-on-niche-code-here-is-why-305f</link>
      <guid>https://forem.com/ziva/domain-specific-ai-beats-general-ai-on-niche-code-here-is-why-305f</guid>
      <description>&lt;p&gt;If your AI coding assistant is great at React but keeps hallucinating on your Django ORM, or fine with Python but useless on your Rust lifetimes, or solid with webdev but writes broken Godot scripts, this post is for you. The pattern is consistent across domains: general-purpose AI coding tools have a frontier they do well inside, and everything outside that frontier gets progressively worse.&lt;/p&gt;

&lt;p&gt;This post is about why, what to do about it, and when staying with a general tool is still the right call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The symptom
&lt;/h2&gt;

&lt;p&gt;You ask a general AI assistant to write code for a framework or engine that is not in the top 20 most-discussed on Stack Overflow. The code looks plausible. It compiles sometimes. When it runs, it breaks in ways that make you question your sanity because the error message points somewhere unrelated to the actual bug.&lt;/p&gt;

&lt;p&gt;You paste the error back. The AI apologizes and writes a different wrong version. Forty minutes in, you give up and do it yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.claude.com/docs/en/best-practices" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, GitHub Copilot, and &lt;a href="https://cursor.com" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt; all hit this wall. It is not about which model is better. It is about the distribution of training data and the lack of runtime context for the specific project you are working on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it happens
&lt;/h2&gt;

&lt;p&gt;Three overlapping causes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Training data frequency.&lt;/strong&gt; LLMs get better at code patterns that appear often in their training corpus. A framework with 100K GitHub repos gets way more attention than one with 1K. This is why React code is almost always right and Godot GDScript code is often half wrong. &lt;a href="https://dev.to/t/gamedev"&gt;DEV.to's community analysis of gamedev engagement&lt;/a&gt; shows the gap: gamedev posts get 10 to 20 reactions while webdev posts regularly clear 200.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context window limits plus "lost in the middle".&lt;/strong&gt; Context windows grew to &lt;a href="https://claude5.com/news/context-window-race-2026-how-200k-to-1m-tokens-transform-ai" rel="noopener noreferrer"&gt;200K, 1M, and beyond over 2024-2026&lt;/a&gt;, which sounded like it would fix everything. It did not. Studies of long-context retrieval found that information buried in the middle of a large context window is retrieved worse than information at the start or end. Paste your whole codebase, and the model will happily ignore the autoload registration on line 11,000 that breaks everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No runtime state.&lt;/strong&gt; A pasted codebase is static. The actual project has scene trees, registered globals, input maps, environment variables, database schemas, and build outputs that the AI cannot see through pasting alone. For niche frameworks where the runtime state matters a lot, the AI is guessing at half of the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "domain-specific" actually means
&lt;/h2&gt;

&lt;p&gt;There are three tiers of AI coding tool, and the names get confusing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;What it knows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;General-purpose&lt;/td&gt;
&lt;td&gt;ChatGPT, Claude, basic Copilot&lt;/td&gt;
&lt;td&gt;Syntax, patterns, public docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE-integrated&lt;/td&gt;
&lt;td&gt;Cursor, &lt;a href="https://code.claude.com" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, full Copilot&lt;/td&gt;
&lt;td&gt;Syntax plus your codebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain-specific&lt;/td&gt;
&lt;td&gt;Tools like &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; for Godot, framework-specific helpers&lt;/td&gt;
&lt;td&gt;Syntax, codebase, and runtime state for one ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The third tier is what this post is about. A domain-specific AI is one whose training, retrieval, and context gathering are built around a single ecosystem. It reads the framework's current release notes, the runtime state of your specific project, and the niche APIs that general AI glosses over.&lt;/p&gt;

&lt;p&gt;The narrow bet is: on the domain it covers, it outperforms general AI. Off-domain, it does nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  When general AI is still the right call
&lt;/h2&gt;

&lt;p&gt;Domain-specific tools are a tradeoff. If your work spans 5 different stacks on a given week, you do not want 5 different AI assistants. The context switching and subscription overhead kills the win.&lt;/p&gt;

&lt;p&gt;General AI is the right call when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your code is in a high-training-frequency ecosystem (React, Django, Rails, Spring, Express).&lt;/li&gt;
&lt;li&gt;You work across many stacks and need one tool that handles all of them.&lt;/li&gt;
&lt;li&gt;The niche parts of your work are small and you can fix them yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Domain-specific AI starts earning its keep when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You spend the majority of your week in one ecosystem.&lt;/li&gt;
&lt;li&gt;That ecosystem has framework-specific patterns the AI keeps getting wrong.&lt;/li&gt;
&lt;li&gt;You have hit the "AI wrote 40 lines of confident-looking garbage" wall more than once.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The practical test
&lt;/h2&gt;

&lt;p&gt;Before committing to a domain-specific tool, run this test. Take three tasks you did this week in your niche framework. Hand them to a general AI with the full relevant file pasted in. Measure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did the generated code compile or run on the first attempt?&lt;/li&gt;
&lt;li&gt;Did it use APIs that actually exist in your framework version?&lt;/li&gt;
&lt;li&gt;Did it reference existing project structures (globals, singletons, shared resources) correctly?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you get two out of three, you are fine. General AI is working for you.&lt;/p&gt;

&lt;p&gt;If you are below that, the cost of a specialized tool is probably worth it. At that point, you are paying in compounding time loss, not just single-task friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;

&lt;p&gt;For Godot specifically, &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;tools like Ziva&lt;/a&gt; that run inside the editor and read project state directly get the autoload, scene-tree, and signal context that a chat-based AI cannot. For Rust, tools that understand borrow-check state across your project do better than generic completion. For Django, ORM-aware tools outperform generic ones on query optimization.&lt;/p&gt;

&lt;p&gt;The pattern holds across ecosystems. The bet is the same: narrow your AI's surface area so the context it has is actually useful, and accept that it does not work outside that surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would not do
&lt;/h2&gt;

&lt;p&gt;Do not buy a specialized AI for every framework you touch. The tradeoff only makes sense when the time you save exceeds the time you lose to juggling tools.&lt;/p&gt;

&lt;p&gt;Do not expect a domain-specific AI to fix a problem that is not domain-specific. If your issue is bad code architecture or unclear requirements, a better AI will not save you.&lt;/p&gt;

&lt;p&gt;Do not assume "domain-specific" means better. It means narrow. On the ecosystem it covers, it should outperform general AI. Off the ecosystem, it does nothing. Measure before you switch, and measure after.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;General AI is great at code patterns that show up a lot in its training data. It gets progressively worse on niche frameworks, version-specific features, and anything that requires runtime project state. Bigger context windows do not fix this. Domain-specific tools exist for the cases where the gap is costing you time.&lt;/p&gt;

&lt;p&gt;Whether you need one depends on how much of your week is in the niche. Run the three-task test before you decide.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>godot</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Cómo llegar a 1000 wishlists en Steam con tu juego de Godot</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Tue, 21 Apr 2026 00:14:58 +0000</pubDate>
      <link>https://forem.com/ziva/como-llegar-a-1000-wishlists-en-steam-con-tu-juego-de-godot-4dn6</link>
      <guid>https://forem.com/ziva/como-llegar-a-1000-wishlists-en-steam-con-tu-juego-de-godot-4dn6</guid>
      <description>&lt;p&gt;Si estás desarrollando tu primer juego en Godot y apuntas a Steam, el número que más importa no es cuánto dinero vas a hacer. Es cuántas wishlists acumulas antes del lanzamiento. La data de 2026 es clara: las wishlists pre-lanzamiento correlacionan con las ventas de la primera semana a r = 0.825, según &lt;a href="https://howtomarketagame.com/2026/04/13/making-sense-of-the-february-2026-steam-next-fest/" rel="noopener noreferrer"&gt;el survey de Chris Zukowski&lt;/a&gt; de 182 desarrolladores que participaron en Steam Next Fest de febrero 2026.&lt;/p&gt;

&lt;p&gt;El problema es que la mediana de un Next Fest suma 806 wishlists. Si entras con cero seguidores, el resultado más probable es que termines con 322 wishlists sumadas en toda la semana. Eso no alcanza.&lt;/p&gt;

&lt;p&gt;Te voy a contar lo que funciona para llegar a 1000 wishlists antes del lanzamiento, basado en lo que los devs que shipearon en Godot en 2025-2026 realmente hicieron.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subí la página de Steam lo antes posible
&lt;/h2&gt;

&lt;p&gt;El algoritmo de Steam premia velocidad, no acumulación. Un juego que lleva 3 meses con la página viva acumulando 10 wishlists por día (900 wishlists al final) termina con mejor señal algorítmica que uno que acumuló 900 wishlists en una sola semana viral.&lt;/p&gt;

&lt;p&gt;Esto significa subir la &lt;a href="https://partner.steamgames.com/doc/store/coming_soon" rel="noopener noreferrer"&gt;Coming Soon page&lt;/a&gt; antes de tener el trailer final. Antes de tener la demo. El costo de equivocarse (actualizar capsules después) es mucho menor que el costo de empezar tarde.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apuntá a 50 reviews, no a 10,000 wishlists
&lt;/h2&gt;

&lt;p&gt;Una observación incómoda de los datos de 2026: Steam empieza a mostrar tu juego en superficies orgánicas (Popular Upcoming, Trending, More Like This) recién cuando cruzás las &lt;a href="https://metricusapp.com/blog/indie-game-distribution-user-acquisition-painpoints-2025-2026/" rel="noopener noreferrer"&gt;50 reviews&lt;/a&gt;. Antes de eso sos invisible, sin importar si tenés 5,000 o 10,000 wishlists.&lt;/p&gt;

&lt;p&gt;Esto cambia la estrategia. No necesitás 10,000 wishlists para lanzar. Necesitás suficiente audiencia para generar 50 reviews la primera semana. La aritmética: si tu conversion rate wishlist-to-buyer es 20% (normal para indie) y el 10% de compradores deja review, necesitás 2,500 wishlists para 50 reviews garantizadas. Por debajo de 2,500 estás apostando.&lt;/p&gt;

&lt;h2&gt;
  
  
  La demo temprano supera a la demo de último momento
&lt;/h2&gt;

&lt;p&gt;Los juegos que lanzaron demo meses antes de Next Fest sumaron 2.5x más wishlists que los que lanzaron la demo durante el fest, según &lt;a href="https://howtomarketagame.com/2026/04/13/making-sense-of-the-february-2026-steam-next-fest/" rel="noopener noreferrer"&gt;el mismo survey&lt;/a&gt;. La correlación no es gigante (r = -0.205) pero la dirección es consistente en tres ediciones de Next Fest seguidas.&lt;/p&gt;

&lt;p&gt;Cairn, de &lt;a href="https://howtomarketagame.com/2025/10/20/steam-next-fest-october-2025-checking-in-on-the-games-that-broke-through/" rel="noopener noreferrer"&gt;The Game Bakers&lt;/a&gt;, lanzó su demo en diciembre 2024 y entró a Next Fest en octubre 2025. 16 meses de runway. Al momento del fest, la demo ya tenía 200,000+ downloads y el juego acumulaba 32,000 wishlists.&lt;/p&gt;

&lt;p&gt;Para un dev solo en LatAm, la lección: no guardes la demo para "cuando esté perfecta". Lanzá a los 6 meses de desarrollo, aunque tengas solo 20 minutos jugables. Lo que buscás es tiempo en el algoritmo, no perfección en la demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Godot es el engine correcto para iterar rápido
&lt;/h2&gt;

&lt;p&gt;Acá es donde la elección del engine importa. &lt;a href="https://godotengine.org/releases/4.5/" rel="noopener noreferrer"&gt;Godot 4.5&lt;/a&gt; compila cambios en menos de 5 segundos en hardware mediano. Los archivos de escena son texto plano, así que podés usar git real sin los problemas del YAML de Unity. El shader baker de 4.5 te da 20x mejor load time en Metal y D3D12.&lt;/p&gt;

&lt;p&gt;Para iteración semanal (que es lo que importa cuando estás respondiendo a feedback de tu Discord de 100 personas), Godot te saca como 15 minutos de cada ciclo comparado con Unity. Eso en 6 meses son ~30 horas de trabajo recuperadas.&lt;/p&gt;

&lt;p&gt;Si estás usando una IA para generar código GDScript, herramientas como &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; corren el código que generan contra el editor de Godot en vivo, lo que te evita el problema de que la IA alucine funciones de Godot 3 que ya no existen en 4.5. No es que sea mejor que escribir a mano, es que reduce el costo de "lo probé y no compila" a cero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Marketing concentrado: 5 YouTubers, no 50
&lt;/h2&gt;

&lt;p&gt;La distribución en español de Godot está concentrada. Hay 4-5 creators en YouTube y Twitch que cubren prácticamente toda la comunidad hispanohablante. Si tu demo es buena, no necesitás mandarles email a 200 influencers. Necesitás que 3 de esos 5 la mencionen. Eso te llega al 80% de tu audiencia hispanohablante potencial. La distribución concentrada en un engine chico es, desde el punto de vista de marketing indie, mejor que la distribución fragmentada de Unity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist de 6 meses
&lt;/h2&gt;

&lt;p&gt;Si empezás hoy y apuntás a lanzar en 6 meses:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mes 1-2:&lt;/strong&gt; Subí la Coming Soon page. Capsules básicas, trailer de 30 segundos. Empezá a hacer devlog semanal en YouTube o TikTok.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mes 3:&lt;/strong&gt; Lanzá una demo de 15-20 minutos. No esperes a tener todo perfecto. La demo va a iterar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mes 4-5:&lt;/strong&gt; Revisá las reviews de la demo semanalmente. Subí patches. Construí una comunidad de Discord de 50+ personas activas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mes 6:&lt;/strong&gt; Entrá a Steam Next Fest de junio u octubre con una demo mejorada y ~3,000 wishlists acumuladas. El Next Fest te va a sumar 1,500-3,000 más si hiciste bien los meses anteriores.&lt;/p&gt;

&lt;p&gt;Lanzá al mes 7 con ~5,000-7,000 wishlists. Primera semana: ~500 ventas, ~50 reviews. A partir de ahí, Steam empieza a trabajar a favor tuyo.&lt;/p&gt;

&lt;p&gt;Ninguna de estas cifras garantiza éxito. El 91.5% de los juegos indie en Steam &lt;a href="https://www.steampageanalyzer.com/blog/indie-game-revenue-data" rel="noopener noreferrer"&gt;no pasan los $100K en ingresos brutos&lt;/a&gt;. Pero apuntar a 1,000 wishlists antes de lanzar con un plan claro es la diferencia entre tener una chance real y no tenerla.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>godot</category>
      <category>gamedev</category>
      <category>ai</category>
    </item>
    <item>
      <title>7 Godot 4 API Calls Your AI Assistant Still Gets Wrong</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Mon, 20 Apr 2026 23:57:36 +0000</pubDate>
      <link>https://forem.com/ziva/7-godot-4-api-calls-your-ai-assistant-still-gets-wrong-3ep6</link>
      <guid>https://forem.com/ziva/7-godot-4-api-calls-your-ai-assistant-still-gets-wrong-3ep6</guid>
      <description>&lt;p&gt;If you have asked Copilot, Claude, or ChatGPT to write Godot code in the last six months, you have hit this: the generated code looks reasonable, compiles clean, and then fails at runtime because the function name does not exist. Godot 4 shipped in &lt;a href="https://godotengine.org/article/godot-4-0-sets-sail/" rel="noopener noreferrer"&gt;March 2023&lt;/a&gt; with a completely rewritten GDScript and dozens of renamed APIs. Training data for most LLMs still overrepresents Godot 3 tutorials. The result is an asymmetric failure mode: the code looks right, even to a reviewer who has not touched Godot 3, and you only find out it is broken when you run the game.&lt;/p&gt;

&lt;p&gt;Here are seven of the most common API calls where AI assistants hallucinate the Godot 3 version, with the Godot 4 replacement and a short note on why each one specifically keeps tripping up the models.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;code&gt;deg2rad&lt;/code&gt; → &lt;code&gt;deg_to_rad&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The old name, &lt;code&gt;deg2rad(angle)&lt;/code&gt;, still appears all over Reddit and StackOverflow posts from 2020 to 2022. In Godot 4 it is &lt;a href="https://docs.godotengine.org/en/stable/classes/class_%40globalscope.html#class-globalscope-method-deg-to-rad" rel="noopener noreferrer"&gt;&lt;code&gt;deg_to_rad&lt;/code&gt;&lt;/a&gt; with underscores. Same for &lt;code&gt;rad2deg&lt;/code&gt; → &lt;code&gt;rad_to_deg&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is the single most-hallucinated function in my experience. The numeric "2" in the old name is legacy from the C++ style used in older Godot versions, and the rename to a readable verb was one of the first things the Godot 4 style guide pushed. LLMs still reach for the short form because it is shorter and because the training data is denser.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;code&gt;KinematicBody2D&lt;/code&gt; → &lt;code&gt;CharacterBody2D&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Godot 3 had &lt;code&gt;KinematicBody2D&lt;/code&gt; and &lt;code&gt;KinematicBody&lt;/code&gt; (for 3D). Godot 4 &lt;a href="https://docs.godotengine.org/en/stable/tutorials/physics/physics_introduction.html" rel="noopener noreferrer"&gt;renamed both&lt;/a&gt; to &lt;code&gt;CharacterBody2D&lt;/code&gt; and &lt;code&gt;CharacterBody3D&lt;/code&gt;. The internal semantics also changed: &lt;code&gt;move_and_slide()&lt;/code&gt; no longer takes a velocity argument; you set &lt;code&gt;velocity&lt;/code&gt; as a property first, then call the method.&lt;/p&gt;

&lt;p&gt;AI assistants get the class rename right about half the time. Where they fail consistently is the call signature. You will see generated code like &lt;code&gt;move_and_slide(velocity, Vector2.UP)&lt;/code&gt; which is valid Godot 3 and a runtime error in Godot 4.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;code&gt;set_shader_param&lt;/code&gt; → &lt;code&gt;set_shader_parameter&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ShaderMaterial.set_shader_param(name, value)&lt;/code&gt; became &lt;a href="https://docs.godotengine.org/en/stable/classes/class_shadermaterial.html" rel="noopener noreferrer"&gt;&lt;code&gt;set_shader_parameter(name, value)&lt;/code&gt;&lt;/a&gt;. The &lt;code&gt;get_shader_param&lt;/code&gt; pair also renamed.&lt;/p&gt;

&lt;p&gt;This one is tricky because shader workflow tutorials from the Godot 3 era are high-quality and heavily SEO-optimized. When an AI reaches for shader code, it reaches for the tutorial it was trained on, and that tutorial says &lt;code&gt;set_shader_param&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;code&gt;BUTTON_LEFT&lt;/code&gt; → &lt;code&gt;MOUSE_BUTTON_LEFT&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Mouse button constants got a prefix. &lt;code&gt;BUTTON_LEFT&lt;/code&gt;, &lt;code&gt;BUTTON_RIGHT&lt;/code&gt;, &lt;code&gt;BUTTON_MIDDLE&lt;/code&gt;, and the wheel constants are now &lt;a href="https://docs.godotengine.org/en/stable/classes/class_%40globalscope.html#enum-globalscope-mousebutton" rel="noopener noreferrer"&gt;&lt;code&gt;MOUSE_BUTTON_*&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Why it matters: this is a runtime-only failure. If your input handler checks &lt;code&gt;event.button_index == BUTTON_LEFT&lt;/code&gt;, the comparison never matches because &lt;code&gt;BUTTON_LEFT&lt;/code&gt; resolves to a different numeric value (or doesn't exist at all, depending on how the constant is scoped).&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;code&gt;rand_range&lt;/code&gt; → &lt;code&gt;randf_range&lt;/code&gt; / &lt;code&gt;randi_range&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Godot 3's &lt;code&gt;rand_range(min, max)&lt;/code&gt; returned a float. Godot 4 splits this into &lt;a href="https://docs.godotengine.org/en/stable/classes/class_%40globalscope.html#class-globalscope-method-randf-range" rel="noopener noreferrer"&gt;&lt;code&gt;randf_range&lt;/code&gt;&lt;/a&gt; (float) and &lt;a href="https://docs.godotengine.org/en/stable/classes/class_%40globalscope.html#class-globalscope-method-randi-range" rel="noopener noreferrer"&gt;&lt;code&gt;randi_range&lt;/code&gt;&lt;/a&gt; (int). The type-explicit naming is good. The fact that every AI assistant still generates &lt;code&gt;rand_range&lt;/code&gt; is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. &lt;code&gt;yield()&lt;/code&gt; → &lt;code&gt;await&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Godot 3 used a custom &lt;code&gt;yield()&lt;/code&gt; function for coroutines: &lt;code&gt;yield(get_tree().create_timer(1.0), "timeout")&lt;/code&gt;. Godot 4 &lt;a href="https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#awaiting-signals-or-coroutines" rel="noopener noreferrer"&gt;replaced this with standard &lt;code&gt;await&lt;/code&gt;&lt;/a&gt;: &lt;code&gt;await get_tree().create_timer(1.0).timeout&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is the largest syntactic shift in the list, and the one where AI code breaks most visibly. &lt;code&gt;yield()&lt;/code&gt; in Godot 4 is a Python-style function that does not exist. You get an immediate parse error, which at least makes it easy to catch. Compare that to the mouse button case, which silently fails forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. &lt;code&gt;Directory&lt;/code&gt; → &lt;code&gt;DirAccess&lt;/code&gt; / &lt;code&gt;FileAccess&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The global &lt;code&gt;Directory&lt;/code&gt; class, and its pair &lt;code&gt;File&lt;/code&gt;, were both removed in Godot 4. The replacement is &lt;a href="https://docs.godotengine.org/en/stable/classes/class_diraccess.html" rel="noopener noreferrer"&gt;&lt;code&gt;DirAccess&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://docs.godotengine.org/en/stable/classes/class_fileaccess.html" rel="noopener noreferrer"&gt;&lt;code&gt;FileAccess&lt;/code&gt;&lt;/a&gt;, both with static factory methods: &lt;code&gt;DirAccess.open(path)&lt;/code&gt; and &lt;code&gt;FileAccess.open(path, FileAccess.READ)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The old class-based API used &lt;code&gt;var f = File.new()&lt;/code&gt; followed by &lt;code&gt;f.open(path, File.READ)&lt;/code&gt;. AI assistants still reach for this because File I/O is one of the most commonly documented patterns and the old one was in wide circulation for years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this keeps happening
&lt;/h2&gt;

&lt;p&gt;Two forces make Godot particularly prone to this failure mode:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Training data density favors Godot 3.&lt;/strong&gt; Godot 4 launched in March 2023. The bulk of high-quality community tutorials, Reddit answers, and StackOverflow posts were written before that. When an LLM computes "what is the most likely next token after &lt;code&gt;shader_&lt;/code&gt;," the frequency of &lt;code&gt;param&lt;/code&gt; in the training corpus still dominates &lt;code&gt;parameter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Godot 4 minor versions keep changing signatures.&lt;/strong&gt; The &lt;a href="https://godotengine.org/releases/4.5/" rel="noopener noreferrer"&gt;Godot 4.5 release notes&lt;/a&gt; mention variadic function signature changes that broke compatibility with 4.3 and 4.4. Even a model with training data that ends in late 2025 has not seen enough 4.5 examples to correctly weight them.&lt;/p&gt;

&lt;p&gt;The result: the newer your Godot version, the worse any general-purpose coding assistant performs. This is not a problem that gets solved by a bigger context window. It gets solved by giving the model the current API, either through retrieval-augmented generation against Godot's docs or through a purpose-built plugin that can run the code and test the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to work around it
&lt;/h2&gt;

&lt;p&gt;Three things help:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Paste the &lt;a href="https://gist.github.com/raulsntos/06ac5dd10ebccc3a4f1e7e3ad30dc876" rel="noopener noreferrer"&gt;Godot 4.x breaking changes list&lt;/a&gt; into your system prompt.&lt;/strong&gt; It is a short file maintained by a Godot contributor and it catches most of the renames. A 2-page addendum to the system prompt is worth more than any clever reasoning you can add.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use an agent that runs the code it generates.&lt;/strong&gt; A parse error catches &lt;code&gt;yield()&lt;/code&gt;. A runtime test catches &lt;code&gt;BUTTON_LEFT&lt;/code&gt;. The mouse button case specifically cannot be caught by any static linter because the comparison is syntactically valid. Tools like &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; solve this by running the generated code against a live Godot editor and surfacing runtime errors back to the model, but any setup that executes the code will catch the silent-failure cases that matter most.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prefer static typing.&lt;/strong&gt; Godot 4 supports &lt;code&gt;var velocity: Vector2&lt;/code&gt;. Typed variables turn some of these hallucinations into editor errors. It does not help with constants or function names, but it catches a surprising number of incompatible signature cases.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are shipping a Godot game in 2026 and letting AI generate scripts, the practical move is to pair any generation step with an execution step. "Does it compile" is not the right test. The right test is "does the node still behave correctly when you run the scene." Everything else is theater.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>ai</category>
      <category>gamedev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Godot 4.4 Added .uid Files Everywhere. Here's What They Actually Do.</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Mon, 20 Apr 2026 00:38:57 +0000</pubDate>
      <link>https://forem.com/ziva/godot-44-added-uid-files-everywhere-heres-what-they-actually-do-4e56</link>
      <guid>https://forem.com/ziva/godot-44-added-uid-files-everywhere-heres-what-they-actually-do-4e56</guid>
      <description>&lt;p&gt;If you upgraded a Godot project from 4.3 to 4.4 and suddenly saw a wave of new &lt;code&gt;.uid&lt;/code&gt; files next to every &lt;code&gt;.gd&lt;/code&gt; and &lt;code&gt;.gdshader&lt;/code&gt;, you were not alone. Every GitHub thread I found from early 2025 had someone asking whether to delete them, gitignore them, or commit them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://godotengine.org/article/uid-changes-coming-to-godot-4-4/" rel="noopener noreferrer"&gt;The answer is: commit them.&lt;/a&gt; They are not noise. They fix a real problem Godot has had since day one, and understanding them is the difference between a clean refactor and a broken scene tree the next morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem the .uid files solve
&lt;/h2&gt;

&lt;p&gt;Before 4.4, Godot referenced every resource by its file path. If you moved &lt;code&gt;res://scripts/player.gd&lt;/code&gt; to &lt;code&gt;res://entities/player/player.gd&lt;/code&gt; without doing it through the editor, every scene that referenced that script would break. The typical workflow for a larger team looked like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Refactor the folder structure outside the editor (in VS Code or the terminal)&lt;/li&gt;
&lt;li&gt;Reopen Godot&lt;/li&gt;
&lt;li&gt;Watch half your scenes fail to load&lt;/li&gt;
&lt;li&gt;Manually re-link every broken reference in the inspector&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Godot already used UIDs for scenes and most imported resources. But &lt;a href="https://godotengine.org/article/uid-changes-coming-to-godot-4-4/" rel="noopener noreferrer"&gt;scripts and shaders were excluded&lt;/a&gt; because they are plain text files with no place to store engine metadata. You moved &lt;code&gt;player.gd&lt;/code&gt; and Godot had no way to know it was still the same script.&lt;/p&gt;

&lt;p&gt;The 4.4 release solves that with sidecar files. &lt;code&gt;player.gd&lt;/code&gt; now ships with &lt;code&gt;player.gd.uid&lt;/code&gt; alongside it. The &lt;code&gt;.uid&lt;/code&gt; file contains a single line: a UID like &lt;code&gt;uid://c82j4l3r4k4n2&lt;/code&gt;. Every scene that references that script stores the UID, not the path. Move the file to another folder, and Godot finds it through the UID.&lt;/p&gt;

&lt;h2&gt;
  
  
  What file types got .uid files
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://godotengine.org/article/uid-changes-coming-to-godot-4-4/" rel="noopener noreferrer"&gt;Godot blog post&lt;/a&gt; is explicit about which types are affected:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source file&lt;/th&gt;
&lt;th&gt;Sidecar file&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.gd&lt;/code&gt; (GDScript)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.gd.uid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.cs&lt;/code&gt; (C#)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.cs.uid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.gdshader&lt;/code&gt; (shader)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.gdshader.uid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.gdshaderinc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.gdshaderinc.uid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Scenes (&lt;code&gt;.tscn&lt;/code&gt;) and most imported resources already had UIDs stored in their own headers since earlier versions, so they did not need sidecars. This change is specifically for the plain-text formats that previously had no UID hook.&lt;/p&gt;

&lt;h2&gt;
  
  
  The .gitignore mistake
&lt;/h2&gt;

&lt;p&gt;The single biggest footgun with the new system is treating &lt;code&gt;.uid&lt;/code&gt; files like build artifacts and adding them to &lt;code&gt;.gitignore&lt;/code&gt;. I have seen this in multiple public Godot repos since the 4.4 release. If you gitignore &lt;code&gt;.uid&lt;/code&gt;, every clone of your repo generates fresh UIDs, and every scene that references your scripts points at UIDs that exist only on the original author's machine. The project opens, the scripts technically load, but the scene-to-script links are now broken for every collaborator.&lt;/p&gt;

&lt;p&gt;The correct answer, per the Godot team: &lt;a href="https://godotengine.org/article/uid-changes-coming-to-godot-4-4/" rel="noopener noreferrer"&gt;commit the &lt;code&gt;.uid&lt;/code&gt; files to version control&lt;/a&gt;. They are part of your project state, not generated output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for external refactoring
&lt;/h2&gt;

&lt;p&gt;The part I like most is that moving files outside the editor is now officially supported. Before 4.4, the unwritten rule was "always do refactors inside Godot." Now you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Close Godot&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;git mv&lt;/code&gt; or &lt;code&gt;mv&lt;/code&gt; on any script or shader, together with its &lt;code&gt;.uid&lt;/code&gt; sidecar&lt;/li&gt;
&lt;li&gt;Reopen Godot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The editor looks up the UID, finds the file in its new location, and updates the path in any referencing scene when you save. Nothing breaks. This is the kind of affordance that only matters when your project is large enough that "refactor inside the editor" becomes tedious, but at that point it matters a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  One gotcha: the UID cache can lag
&lt;/h2&gt;

&lt;p&gt;There is &lt;a href="https://github.com/godotengine/godot/issues/112509" rel="noopener noreferrer"&gt;a known bug&lt;/a&gt; where renaming a scene file externally does not immediately update the UID cache, which can cause temporary stale references. The fix is to reopen the project so Godot rescans the filesystem. The bug is open as of writing and affects the 4.4 line; the 4.6 release did not mark it as fixed. If you hit it, reopening the project clears it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this has to do with AI coding tools
&lt;/h2&gt;

&lt;p&gt;Every AI assistant trained on pre-4.4 Godot does not know what a &lt;code&gt;.uid&lt;/code&gt; file is. Ask ChatGPT or a generic coding assistant to refactor your Godot project's folder structure, and it will happily suggest moving scripts without moving their &lt;code&gt;.uid&lt;/code&gt; sidecars. You run the suggested commands, reopen the editor, and watch your scenes break in the exact way the UID system was designed to prevent.&lt;/p&gt;

&lt;p&gt;Tools that run natively inside the Godot editor (there are a handful now, &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; being one of them) have a structural advantage here: they can read the current UID index directly, know which sidecar belongs to which source file, and keep them together on any file operation. The generic chatbot approach cannot do this. It can only suggest; it cannot see.&lt;/p&gt;

&lt;p&gt;If you are evaluating AI tooling for Godot work, this is the kind of thing to test. Ask your candidate tool to move &lt;code&gt;player.gd&lt;/code&gt; from one folder to another and see whether it touches the &lt;code&gt;.uid&lt;/code&gt; file. If not, expect broken scenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical migration checklist
&lt;/h2&gt;

&lt;p&gt;If you are upgrading a Godot 4.3 project to 4.4 or later today, three things make the transition painless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open the project in 4.4 and re-save every scene.&lt;/strong&gt; The editor regenerates UID references in each scene file, which is what makes the sidecars useful. This is a one-time cleanup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove any &lt;code&gt;*.uid&lt;/code&gt; entry from your &lt;code&gt;.gitignore&lt;/code&gt; if it exists.&lt;/strong&gt; Commit the files. They are ~30 bytes each and they are part of the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When moving files externally, always move the &lt;code&gt;.uid&lt;/code&gt; alongside.&lt;/strong&gt; &lt;code&gt;git mv player.gd entities/player/player.gd &amp;amp;&amp;amp; git mv player.gd.uid entities/player/player.gd.uid&lt;/code&gt; is the pattern.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The UID system is one of the Godot 4.x changes that feels invisible until it saves you an afternoon of re-linking references. Treat the sidecar files the way you treat &lt;code&gt;package-lock.json&lt;/code&gt; or &lt;code&gt;Cargo.lock&lt;/code&gt;: commit them and forget about them.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Warum Slay the Spire 2 auf Godot setzt (und was das für Entwickler bedeutet)</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Mon, 13 Apr 2026 21:39:17 +0000</pubDate>
      <link>https://forem.com/ziva/warum-slay-the-spire-2-auf-godot-setzt-und-was-das-fur-entwickler-bedeutet-4cdl</link>
      <guid>https://forem.com/ziva/warum-slay-the-spire-2-auf-godot-setzt-und-was-das-fur-entwickler-bedeutet-4cdl</guid>
      <description>&lt;p&gt;Slay the Spire 2 hat am 5. März 2026 &lt;a href="https://steamdb.info/app/2868840/charts/" rel="noopener noreferrer"&gt;574.638 gleichzeitige Spieler auf Steam erreicht&lt;/a&gt;. Gebaut auf Godot. Nicht Unity. Nicht Unreal. Das Open-Source-Projekt, das viele noch vor drei Jahren als Hobby-Engine abgetan haben.&lt;/p&gt;

&lt;p&gt;Das ist kein Einzelfall. Die Daten zeigen einen klaren Trend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was passiert ist
&lt;/h2&gt;

&lt;p&gt;Mega Crit hatte über zwei Jahre an Slay the Spire 2 in Unity gearbeitet. Im September 2023 &lt;a href="https://www.pcgamer.com/games/card-games/slay-the-spire-2-ditched-unity-for-open-source-engine-godot-after-2-years-of-development/" rel="noopener noreferrer"&gt;kündigte Unity die Runtime-Gebühr an&lt;/a&gt;. Mega Crits Reaktion war ein offener Brief: "That is how badly you fucked up."&lt;/p&gt;

&lt;p&gt;Unity ruderte zurück. Der CEO trat zurück. Mega Crit wechselte trotzdem zu Godot und baute das Spiel komplett neu auf.&lt;/p&gt;

&lt;p&gt;Das Ergebnis: fast 575.000 gleichzeitige Spieler, knapp unter dem Silksong-Rekord von 587.150. Mega Crit ist inzwischen &lt;a href="https://www.gamingonlinux.com/2026/04/godot-gets-a-funding-boost-from-slay-the-spire-2-devs-mega-crit/" rel="noopener noreferrer"&gt;Platinum-Sponsor der Godot Foundation&lt;/a&gt; mit 36.000 Euro pro Jahr.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Umsatzzahlen der größten Godot-Spiele
&lt;/h2&gt;

&lt;p&gt;Slay the Spire 2 ist noch im Early Access, daher fehlen verlässliche Umsatzschätzungen. Aber die anderen kommerziellen Godot-Erfolge sprechen für sich:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spiel&lt;/th&gt;
&lt;th&gt;Geschätzter Umsatz&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;th&gt;Bewertung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Brotato&lt;/td&gt;
&lt;td&gt;10,7 Mio. $&lt;/td&gt;
&lt;td&gt;102.051&lt;/td&gt;
&lt;td&gt;96,6 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buckshot Roulette&lt;/td&gt;
&lt;td&gt;6,9 Mio. $&lt;/td&gt;
&lt;td&gt;102.849&lt;/td&gt;
&lt;td&gt;95,7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dome Keeper&lt;/td&gt;
&lt;td&gt;6,1 Mio. $&lt;/td&gt;
&lt;td&gt;17.173&lt;/td&gt;
&lt;td&gt;92,3 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backpack Battles&lt;/td&gt;
&lt;td&gt;5,2 Mio. $&lt;/td&gt;
&lt;td&gt;17.455&lt;/td&gt;
&lt;td&gt;91,1 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cassette Beasts&lt;/td&gt;
&lt;td&gt;4,1 Mio. $&lt;/td&gt;
&lt;td&gt;9.772&lt;/td&gt;
&lt;td&gt;94,7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Halls of Torment&lt;/td&gt;
&lt;td&gt;3,4 Mio. $&lt;/td&gt;
&lt;td&gt;29.767&lt;/td&gt;
&lt;td&gt;95,7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Zusammen über &lt;a href="https://ziva.sh/blogs/godot-engine-games" rel="noopener noreferrer"&gt;48 Millionen Dollar geschätzter Umsatz&lt;/a&gt;. Jedes Spiel hat eine Bewertung über 91 %.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum Godot wächst
&lt;/h2&gt;

&lt;p&gt;Drei Faktoren treiben das Wachstum:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. MIT-Lizenz ohne Einschränkungen.&lt;/strong&gt; Keine Runtime-Gebühren, keine Umsatzbeteiligung. Godot kostet nichts, egal wie erfolgreich dein Spiel wird. Nach Unitys Preisänderung ist das kein technisches Detail mehr, sondern ein Geschäftsrisiko, das Godot eliminiert.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Textbasierte Szenendateien.&lt;/strong&gt; Godot speichert Szenen als &lt;code&gt;.tscn&lt;/code&gt;-Dateien im Klartext. Git-Diffs funktionieren, KI-Tools können Szenen lesen und generieren, und Standard-Unix-Tools sind einsetzbar. Unity-Szenen sind binär. Dieser Unterschied wird immer wichtiger, je mehr Entwickler KI-Tools in ihren Workflow integrieren. Tools wie &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; nutzen dieses Format direkt, um Szenen aus natürlicher Sprache zu generieren.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Kleine Teams dominieren.&lt;/strong&gt; Buckshot Roulette wurde von einem einzelnen Entwickler aus Estland gebaut. Road to Vostok von einem Solo-Entwickler aus Finnland, der am 7. April 2026 die &lt;a href="https://games.gg/news/road-to-vostok-hits-steam-top-10/" rel="noopener noreferrer"&gt;Steam Top 10 erreichte&lt;/a&gt;. Godots Editor ist 120 MB groß und braucht kein Konto, keine Lizenz und keine Internetverbindung.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Zahlen zum Wachstum
&lt;/h2&gt;

&lt;p&gt;Godot-Spiele auf Steam pro Jahr:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2020: 47&lt;/li&gt;
&lt;li&gt;2021: 97&lt;/li&gt;
&lt;li&gt;2022: 195&lt;/li&gt;
&lt;li&gt;2023: 389&lt;/li&gt;
&lt;li&gt;2024: 618&lt;/li&gt;
&lt;li&gt;2025: über 1.500&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das ist eine &lt;a href="https://ziva.sh/blogs/godot-growth-stats" rel="noopener noreferrer"&gt;Verdopplung pro Jahr&lt;/a&gt;. 5 % aller Steam-Veröffentlichungen in 2024 nutzten Godot. Beim GMTK Game Jam 2025 lag Godots Anteil bei 39 %, gegenüber 13 % vier Jahre zuvor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was das für deutsche Spieleentwickler bedeutet
&lt;/h2&gt;

&lt;p&gt;Deutschland ist der &lt;a href="https://www.game.de/marktdaten/" rel="noopener noreferrer"&gt;größte Spielemarkt Europas&lt;/a&gt;. Die Bundesregierung fördert Spieleentwicklung mit über 50 Millionen Euro jährlich. Gleichzeitig setzen viele deutsche Studios auf Unity oder Unreal.&lt;/p&gt;

&lt;p&gt;Für kleine Studios und Solo-Entwickler lohnt sich ein Blick auf Godot. Die Einstiegshürde ist niedrig (120 MB Download, GDScript liest sich wie Python), die Lizenzkosten sind null, und die kommerzielle Erfolgsbilanz wächst mit jedem Quartal.&lt;/p&gt;

&lt;p&gt;574.638 gleichzeitige Spieler sind kein Argument, das man leicht ignorieren kann.&lt;/p&gt;

</description>
      <category>german</category>
      <category>deutsch</category>
      <category>godot</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>5 Engineering Decisions That Made Godot the Fastest-Growing Game Engine</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Mon, 13 Apr 2026 21:26:04 +0000</pubDate>
      <link>https://forem.com/ziva/5-engineering-decisions-that-made-godot-the-fastest-growing-game-engine-5hgh</link>
      <guid>https://forem.com/ziva/5-engineering-decisions-that-made-godot-the-fastest-growing-game-engine-5hgh</guid>
      <description>&lt;p&gt;Godot went from 47 game releases on Steam in 2020 to &lt;a href="https://ziva.sh/blogs/godot-growth-stats" rel="noopener noreferrer"&gt;over 1,500 in 2025&lt;/a&gt;. Slay the Spire 2, built on Godot after Mega Crit &lt;a href="https://www.pcgamer.com/games/card-games/slay-the-spire-2-ditched-unity-for-open-source-engine-godot-after-2-years-of-development/" rel="noopener noreferrer"&gt;scrapped two years of Unity development&lt;/a&gt;, hit &lt;a href="https://steamdb.info/app/2868840/charts/" rel="noopener noreferrer"&gt;574,638 concurrent players&lt;/a&gt; on Steam. Five percent of all games released on Steam in 2024 used Godot.&lt;/p&gt;

&lt;p&gt;That growth did not happen because of marketing. Godot has no venture capital, no sales team, no enterprise contracts. It grew because of five architectural decisions that compounded over time. If you build developer tools of any kind, these decisions are worth studying.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. MIT license, no exceptions
&lt;/h2&gt;

&lt;p&gt;Godot uses the MIT license. Not "free with conditions." Not "free until you make money." &lt;a href="https://github.com/godotengine/godot/blob/master/LICENSE.txt" rel="noopener noreferrer"&gt;MIT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unity charges a runtime fee above certain revenue thresholds. Unreal takes 5% of gross revenue above $1 million. Godot takes nothing. Ever.&lt;/p&gt;

&lt;p&gt;This matters more than it seems. When Unity &lt;a href="https://www.gamedeveloper.com/business/slay-the-spire-devs-followed-through-on-abandoning-unity" rel="noopener noreferrer"&gt;announced its per-install fee&lt;/a&gt; in September 2023, studios with years of development invested had to evaluate whether to absorb the cost or switch engines. Mega Crit chose to rewrite. &lt;a href="https://godotengine.org/article/godot-showcase-buckshot-roulette/" rel="noopener noreferrer"&gt;Mike Klubnika&lt;/a&gt;, creator of Buckshot Roulette (8 million copies sold), switched to Godot and said: "I really liked the fact that Godot was open source."&lt;/p&gt;

&lt;p&gt;The web development world learned this lesson with open-core tools that changed pricing. Godot cannot change pricing because there is no pricing to change. The MIT license is a binding commitment to developers, and it removes a category of business risk entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Text-based scene files
&lt;/h2&gt;

&lt;p&gt;Godot scenes are stored as &lt;code&gt;.tscn&lt;/code&gt; files. They are plain text. You can open one in any editor and read it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[gd_scene format=3]&lt;/span&gt;

&lt;span class="nn"&gt;[node name="Player" type="CharacterBody2D"]&lt;/span&gt;
&lt;span class="py"&gt;position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Vector2(100, 200)&lt;/span&gt;

&lt;span class="nn"&gt;[node name="Sprite" type="Sprite2D" parent="."]&lt;/span&gt;
&lt;span class="py"&gt;texture&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ExtResource("1_abc12")&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unity scenes are binary by default. Unreal Blueprints are binary. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version control works.&lt;/strong&gt; Git diffs show exactly what changed in a scene. No "just merge the binary and pray."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI can read and write scenes.&lt;/strong&gt; An AI tool can generate a complete scene file from a text description and inject it into a project without any binary serialization layer. Tools like &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; use this directly to generate scenes from natural language prompts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation is trivial.&lt;/strong&gt; Grep a scene for a node type. Sed-replace a resource path. Write a CI check that validates scene structure. All standard Unix tools work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Web developers take this for granted. HTML, CSS, and JavaScript are all plain text. The idea of a binary-first UI description format feels alien. Game engines accepted binary scenes as normal for decades. Godot proved they did not have to.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A domain-specific language instead of a general-purpose one
&lt;/h2&gt;

&lt;p&gt;GDScript is not Python. It looks like Python, but it is a &lt;a href="https://docs.godotengine.org/en/stable/getting_started/scripting/gdscript/gdscript_basics.html" rel="noopener noreferrer"&gt;purpose-built language&lt;/a&gt; for game logic. A typical GDScript file is 30-80 lines. The equivalent C# in Unity is 100-300 lines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;CharacterBody2D&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;200.0&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_physics_process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"left"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"right"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"up"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"down"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;velocity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;
    &lt;span class="n"&gt;move_and_slide&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a complete player movement controller. Six lines. The engine handles collision resolution, delta timing, and physics integration. The developer writes game logic, not framework plumbing.&lt;/p&gt;

&lt;p&gt;The tradeoff is real. GDScript is &lt;a href="https://ziva.sh/blogs/gdscript-vs-csharp" rel="noopener noreferrer"&gt;slower than C# for raw computation&lt;/a&gt;. If you need tight loops processing millions of elements, C# or C++ via GDExtension is better. But for the 90% of game code that is event handling, state transitions, and scene manipulation, GDScript's brevity means less code to write, less code to debug, and less context for AI tools to manage.&lt;/p&gt;

&lt;p&gt;The parallel in web development: Tailwind CSS is "worse" than raw CSS in the same way GDScript is "worse" than C#. It is constrained by design. Those constraints are the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A 120 MB download that runs everywhere
&lt;/h2&gt;

&lt;p&gt;The Godot editor is a single binary. 120 MB. It runs on Windows, macOS, Linux, and even in a browser via WebAssembly. No installer, no account creation, no license key, no phone-home telemetry.&lt;/p&gt;

&lt;p&gt;Unity's editor is over 10 GB installed. Unreal is 30+ GB. Both require accounts. Both require internet connections for licensing.&lt;/p&gt;

&lt;p&gt;This has second-order effects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Game jams.&lt;/strong&gt; A developer can download Godot, create a project, and have a playable prototype in under an hour. At the &lt;a href="https://itch.io/jam/gmtk-2025" rel="noopener noreferrer"&gt;GMTK Game Jam&lt;/a&gt;, Godot went from 13% to 39% of entries in four years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Education.&lt;/strong&gt; A teacher can put Godot on a USB drive and hand it to students. No IT department needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD.&lt;/strong&gt; Godot headless exports run on any Linux box. No need to license a build server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson for tool builders: if your tool requires an account to evaluate, you are losing users who would have become advocates.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Composition over inheritance via the node tree
&lt;/h2&gt;

&lt;p&gt;Godot's scene system uses composition. Every object in a game is a tree of nodes. A player character is a &lt;code&gt;CharacterBody2D&lt;/code&gt; with child nodes for &lt;code&gt;Sprite2D&lt;/code&gt;, &lt;code&gt;CollisionShape2D&lt;/code&gt;, &lt;code&gt;AnimationPlayer&lt;/code&gt;, and whatever else it needs. You add behavior by adding nodes, not by subclassing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Player (CharacterBody2D)
├── Sprite2D
├── CollisionShape2D
├── AnimationPlayer
└── HealthComponent (custom)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the same pattern as React's component tree, which &lt;a href="https://en.wikipedia.org/wiki/Scene_graph" rel="noopener noreferrer"&gt;borrowed the concept from scene graphs&lt;/a&gt; that game engines used decades earlier. If you understand React components, you already understand Godot's node tree.&lt;/p&gt;

&lt;p&gt;The practical benefit: scenes are reusable. You can build a "HealthComponent" scene and instance it on any entity. You can nest scenes inside scenes. The composition is unlimited and does not require inheritance hierarchies that become brittle at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compound effect
&lt;/h2&gt;

&lt;p&gt;None of these decisions is unique in isolation. Plenty of tools are MIT-licensed. Plenty use text formats. Plenty are small. But the combination produces a developer experience where:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You download a 120 MB binary (no account)&lt;/li&gt;
&lt;li&gt;You write 30-line scripts in a language designed for the domain&lt;/li&gt;
&lt;li&gt;Your scenes are text files that work with git and AI tools&lt;/li&gt;
&lt;li&gt;You ship to any platform with no runtime fees&lt;/li&gt;
&lt;li&gt;You own every line of source code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That combination is why Godot went from a niche curiosity to an engine that ships &lt;a href="https://ziva.sh/blogs/godot-engine-games" rel="noopener noreferrer"&gt;games earning over $10 million on Steam&lt;/a&gt;. It is also why the growth is accelerating: each new commercial success validates the architecture for the next wave of developers.&lt;/p&gt;

&lt;p&gt;If you are evaluating game engines in 2026, or just interested in how architectural decisions compound into ecosystem growth, Godot is the case study.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Cómo hacer tu primer juego en Godot con IA en un fin de semana</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Sun, 12 Apr 2026 23:23:13 +0000</pubDate>
      <link>https://forem.com/ziva/como-hacer-tu-primer-juego-en-godot-con-ia-en-un-fin-de-semana-1a91</link>
      <guid>https://forem.com/ziva/como-hacer-tu-primer-juego-en-godot-con-ia-en-un-fin-de-semana-1a91</guid>
      <description>&lt;p&gt;Godot Engine tiene &lt;a href="https://github.com/godotengine/godot" rel="noopener noreferrer"&gt;95,000 estrellas en GitHub&lt;/a&gt; y es completamente gratis. No hay licencias, no hay royalties, no hay letra chica. Si nunca hiciste un juego pero sabés programar, este es el mejor momento para empezar.&lt;/p&gt;

&lt;p&gt;Esta guía cubre cómo armar un juego 2D funcional en Godot 4 usando herramientas de IA para acelerar las partes tediosas: generar código boilerplate, debuggear errores, y prototipar mecánicas rápido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Día 1 (sábado): Setup y mecánicas base
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Instalar Godot
&lt;/h3&gt;

&lt;p&gt;Bajá &lt;a href="https://godotengine.org/download" rel="noopener noreferrer"&gt;Godot 4.x&lt;/a&gt; desde la página oficial. No necesitás instalar nada: es un ejecutable portable. En Linux, macOS y Windows funciona igual.&lt;/p&gt;

&lt;p&gt;Creá un proyecto nuevo y elegí el renderer &lt;strong&gt;Compatibility&lt;/strong&gt; (OpenGL). Es el más estable para juegos 2D y funciona en la mayor cantidad de hardware.&lt;/p&gt;

&lt;h3&gt;
  
  
  Entender la arquitectura
&lt;/h3&gt;

&lt;p&gt;Godot usa un sistema de &lt;strong&gt;nodos&lt;/strong&gt; organizados en un &lt;strong&gt;árbol de escenas&lt;/strong&gt;. Todo es un nodo: tu personaje, los enemigos, el piso, la cámara, la interfaz. Los nodos se combinan en escenas reutilizables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Un nodo CharacterBody2D básico&lt;/span&gt;
&lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;CharacterBody2D&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;200.0&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_physics_process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_vector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ui_left"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ui_right"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ui_up"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"ui_down"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;velocity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;
    &lt;span class="n"&gt;move_and_slide&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este script mueve un personaje con las flechas del teclado. En Godot, &lt;code&gt;_physics_process&lt;/code&gt; se ejecuta 60 veces por segundo y &lt;code&gt;move_and_slide()&lt;/code&gt; maneja las colisiones automáticamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dónde usar IA (y dónde no)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Usá IA para:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generar scripts boilerplate (movimiento, colisiones, spawners)&lt;/li&gt;
&lt;li&gt;Diagnosticar errores de GDScript desde el stack trace&lt;/li&gt;
&lt;li&gt;Prototipar mecánicas que no conocés (sistema de inventario, diálogos, pathfinding)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No uses IA para:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Game design (las decisiones de diseño son tuyas)&lt;/li&gt;
&lt;li&gt;Arte final (los modelos generan assets inconsistentes)&lt;/li&gt;
&lt;li&gt;Código que no entendés (si no podés leerlo, no podés debuggearlo)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Herramientas como &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt;, que corren dentro del editor de Godot, son útiles porque entienden la estructura de tu proyecto. También podés usar ChatGPT o Claude pegando código, pero perdés el contexto del proyecto.&lt;/p&gt;

&lt;p&gt;Según la &lt;a href="https://gdconf.com/article/gdc-2026-state-of-the-game-industry-reveals-impact-of-layoffs-generative-ai-and-more/" rel="noopener noreferrer"&gt;encuesta GDC 2026&lt;/a&gt;, el 47% de los desarrolladores que usan IA la usan para asistencia de código. Solo el 5% la usa para features que el jugador ve directamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Día 1 (tarde): Enemigos y colisiones
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crear enemigos
&lt;/h3&gt;

&lt;p&gt;Creá una nueva escena con un nodo &lt;code&gt;Area2D&lt;/code&gt; como raíz. Agregá un &lt;code&gt;Sprite2D&lt;/code&gt; y un &lt;code&gt;CollisionShape2D&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# enemigo.gd&lt;/span&gt;
&lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Area2D&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;direction&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_on_visible_on_screen_notifier_2d_screen_exited&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;queue_free&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Se borra cuando sale de la pantalla&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Detectar colisiones
&lt;/h3&gt;

&lt;p&gt;Conectá la señal &lt;code&gt;body_entered&lt;/code&gt; del &lt;code&gt;Area2D&lt;/code&gt; del enemigo al jugador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# En el script del enemigo&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_on_body_entered&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_in_group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"player"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;take_damage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;queue_free&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las &lt;strong&gt;señales&lt;/strong&gt; son el sistema de eventos de Godot. Son como callbacks tipados: cuando algo pasa (colisión, timer, animación termina), se emite una señal y los nodos conectados reaccionan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Día 2 (domingo): UI, sonido y exportación
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Interfaz de usuario
&lt;/h3&gt;

&lt;p&gt;Para mostrar puntaje y vidas, usá nodos &lt;code&gt;Label&lt;/code&gt; dentro de un &lt;code&gt;CanvasLayer&lt;/code&gt; (se renderiza encima del juego):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# hud.gd&lt;/span&gt;
&lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;CanvasLayer&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="k"&gt;onready&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;score_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ScoreLabel&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="k"&gt;onready&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;lives_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;LivesLabel&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;update_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;score_label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Puntaje: &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;update_lives&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;lives_label&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Vidas: &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El decorator &lt;code&gt;@onready&lt;/code&gt; asigna la referencia al nodo cuando la escena está lista. Es el equivalente de &lt;code&gt;GetComponent&amp;lt;&amp;gt;()&lt;/code&gt; en Unity o &lt;code&gt;FindNode&lt;/code&gt; en otros motores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sonido
&lt;/h3&gt;

&lt;p&gt;Agregá nodos &lt;code&gt;AudioStreamPlayer&lt;/code&gt; a la escena. Godot soporta &lt;code&gt;.ogg&lt;/code&gt; y &lt;code&gt;.wav&lt;/code&gt; nativamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Reproducir sonido al recibir daño&lt;/span&gt;
&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;HitSound&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para música de fondo, usá un &lt;code&gt;AudioStreamPlayer&lt;/code&gt; en un &lt;strong&gt;Autoload&lt;/strong&gt; (singleton global) para que siga sonando entre escenas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exportar
&lt;/h3&gt;

&lt;p&gt;Para compartir tu juego, exportá a &lt;strong&gt;Web&lt;/strong&gt; (HTML5). Es la forma más rápida de que alguien lo pruebe:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bajá los export templates desde Editor &amp;gt; Manage Export Templates&lt;/li&gt;
&lt;li&gt;Agregá un preset de Web en Project &amp;gt; Export&lt;/li&gt;
&lt;li&gt;Exportá a una carpeta&lt;/li&gt;
&lt;li&gt;Subí los archivos a &lt;a href="https://itch.io" rel="noopener noreferrer"&gt;itch.io&lt;/a&gt; (gratis, sin aprobación)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tu juego está online en menos de 10 minutos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos para seguir
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.godotengine.org/en/stable/" rel="noopener noreferrer"&gt;Documentación oficial de Godot&lt;/a&gt; (también disponible en español)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/@gdquest" rel="noopener noreferrer"&gt;GDQuest en YouTube&lt;/a&gt; (tutoriales paso a paso)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://reddit.com/r/godot" rel="noopener noreferrer"&gt;r/godot en Reddit&lt;/a&gt; (comunidad activa que responde preguntas)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/results?search_query=godot+tutorial+espa%C3%B1ol" rel="noopener noreferrer"&gt;Godot en español&lt;/a&gt; (cada vez hay más contenido en español)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El punto no es hacer un juego perfecto en un fin de semana. Es hacer uno que funcione, subirlo a itch.io, y tener algo concreto que mostrar. El primer juego siempre es malo, y eso está bien.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>godot</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>52% of Game Developers Think AI Is Hurting Their Industry. 36% Use It Anyway.</title>
      <dc:creator>Ziva</dc:creator>
      <pubDate>Sun, 12 Apr 2026 23:04:05 +0000</pubDate>
      <link>https://forem.com/ziva/52-of-game-developers-think-ai-is-hurting-their-industry-36-use-it-anyway-dfk</link>
      <guid>https://forem.com/ziva/52-of-game-developers-think-ai-is-hurting-their-industry-36-use-it-anyway-dfk</guid>
      <description>&lt;p&gt;The GDC 2026 State of the Industry survey asked 2,300 game professionals what they think about generative AI. The results are contradictory in a way that tells you more about the state of AI tooling than any product launch or benchmark ever could.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;52% said AI is bad for the game industry.&lt;/strong&gt; That number was 30% last year and 18% the year before. Only 7% called it positive, down from 13%.&lt;/p&gt;

&lt;p&gt;In the same survey, &lt;strong&gt;36% said they use AI tools at work&lt;/strong&gt;. Among those users, 81% use AI for research and brainstorming, and 47% use it for code assistance.&lt;/p&gt;

&lt;p&gt;Developers are increasingly convinced AI is harmful. They're also increasingly using it. What's going on?&lt;/p&gt;

&lt;h2&gt;
  
  
  The sentiment split isn't random
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://gdconf.com/article/gdc-2026-state-of-the-game-industry-reveals-impact-of-layoffs-generative-ai-and-more/" rel="noopener noreferrer"&gt;GDC 2026 report&lt;/a&gt; breaks down who hates AI and who uses it, and the pattern is clear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Negative sentiment by discipline:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;"AI is bad for the industry"&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visual / technical art&lt;/td&gt;
&lt;td&gt;64%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game design / narrative&lt;/td&gt;
&lt;td&gt;63%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Programming&lt;/td&gt;
&lt;td&gt;59%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;AI adoption by seniority:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Uses AI at work&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Upper management&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lower-level employees&lt;/td&gt;
&lt;td&gt;29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publishing / support firms&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game studios&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The people who think AI is bad are mostly the people whose work AI threatens to replace: artists and writers. The people using AI the most are managers and publishing staff who use it for emails, reports, and brainstorming. These are largely different groups having different experiences.&lt;/p&gt;

&lt;p&gt;One surveyed developer &lt;a href="https://www.gamedeveloper.com/business/one-third-of-game-workers-use-generative-ai-but-half-think-it-s-bad-for-the-industry" rel="noopener noreferrer"&gt;put it plainly&lt;/a&gt;: "Why would I replace human creativity with a regurgitated amalgamation of everything that's come before?"&lt;/p&gt;

&lt;h2&gt;
  
  
  What developers actually use AI for
&lt;/h2&gt;

&lt;p&gt;The use case breakdown from the &lt;a href="https://www.gamedeveloper.com/business/one-third-of-game-workers-use-generative-ai-but-half-think-it-s-bad-for-the-industry" rel="noopener noreferrer"&gt;same survey&lt;/a&gt; is revealing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;% of AI users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Research / brainstorming&lt;/td&gt;
&lt;td&gt;81%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily tasks (emails, code)&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asset generation&lt;/td&gt;
&lt;td&gt;19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Procedural generation&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Player-facing features&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The overwhelming majority use AI for research and code. Almost nobody ships AI-generated content to players. The industry has collectively decided that AI is a backstage tool, not a front-of-house feature.&lt;/p&gt;

&lt;p&gt;This matches what most developers I've seen in forums and postmortems describe: AI is useful for scaffolding code, debugging, and getting past blank-page paralysis. It falls apart when you need pixel-perfect art consistency or narrative voice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool preferences are lopsided
&lt;/h2&gt;

&lt;p&gt;ChatGPT dominates at 74% adoption among AI-using developers. Google Gemini sits at 37%, Microsoft Copilot at 22%. Text-to-image tools lag far behind: Midjourney at 17%, Adobe Generative Fill at 13%.&lt;/p&gt;

&lt;p&gt;The gap between LLM adoption (74%) and image generation adoption (17%) tells you where AI actually delivers value in game dev. Writing and debugging code with a language model works well enough to become habitual. Generating game art that fits a specific style, pipeline, and resolution requirement is much harder.&lt;/p&gt;

&lt;p&gt;This is also why tools that understand game engine context specifically (like &lt;a href="https://ziva.sh" rel="noopener noreferrer"&gt;Ziva&lt;/a&gt; for Godot, or the various MCP-based tools connecting Claude to game editors) have found a niche. A general-purpose LLM generates generic code. A tool that reads your scene tree and project structure generates code that fits.&lt;/p&gt;

&lt;h2&gt;
  
  
  28% lost their jobs in two years
&lt;/h2&gt;

&lt;p&gt;The AI sentiment doesn't exist in a vacuum. The GDC survey found that 28% of respondents lost their job in the past two years. 74% of students said they're concerned about their future job prospects.&lt;/p&gt;

&lt;p&gt;When over a quarter of your colleagues have been laid off and AI is being positioned as the reason companies can "do more with less," negative sentiment isn't irrational. It's self-preservation. The developers who view AI most negatively (artists at 64%, designers at 63%) are the ones whose roles are most visibly threatened by generative models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this leaves us
&lt;/h2&gt;

&lt;p&gt;The data paints a picture of an industry with two parallel realities. In one, developers quietly use AI to brainstorm, scaffold code, and automate repetitive tasks. In the other, the same developers watch their colleagues get laid off while executives pitch AI as a cost-cutting measure.&lt;/p&gt;

&lt;p&gt;Both realities are true simultaneously. AI tools do save time on specific tasks. AI rhetoric is also being used to justify smaller teams and lower budgets. The 52% who view AI negatively aren't technophobes. They're reacting to how AI is being deployed as a labor strategy, not just a productivity tool.&lt;/p&gt;

&lt;p&gt;For developers building AI-assisted tooling (and I work on one), the takeaway is straightforward: the tools that survive will be the ones that make individual developers faster without making their employers think they're replaceable. That means augmenting decisions, not automating them. It means context-aware assistance within the editor, not "AI generates your game for you" marketing.&lt;/p&gt;

&lt;p&gt;The 36% who use AI tools despite the backlash aren't hypocrites. They've found narrow, specific tasks where AI actually helps. The 52% who view AI negatively aren't wrong either. They're responding to a real threat that has nothing to do with the technology and everything to do with how companies choose to use it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
