Zwei Mal in zwei Tagen war das Spiel gar nicht zu bedienen
· spiel · werkzeuge
Pipfold ist am 24. Juli 2026 mit einem einzigen Commit entstanden: Godot 4.7, ein Kasten, neun Klappen, zwei Würfel. Am selben Abend liess sich keine einzige Klappe antippen. Am nächsten Tag war das Spiel nach dem Druck auf „Spielen“ überhaupt nicht mehr bedienbar.
Beide Fehler haben dieselbe Form, und beide sieht man dem Code nicht an.
Tag eins: der Container, der nichts anzeigt und alles schluckt
Über dem Spielfeld lag ein MarginContainer über die volle Fläche. Er
zeichnete nichts — er hielt nur die Bedienelemente auf Abstand vom Rand. Genau
deshalb hat ihn niemand verdächtigt: er ist unsichtbar, also ist er auch
nicht da.
Für die Eingabe ist er sehr wohl da. Ein Control fängt Mausereignisse standardmässig ab, ob es etwas malt oder nicht. Jeder Tipp, der eigentlich der Klappe darunter galt, endete an einer leeren Fläche.
Behoben: die Aktionsleiste liegt nur noch unten statt über allem, die Trefferboxen der Klappen wurden dicker, und für den Finger kam ein Rückfallpfad über die Bildschirmkoordinaten dazu.
Tag zwei: beide Leisten unterhalb des Bildschirms
Am nächsten Tag war es schlimmer. Nach „Spielen“ gab es keinen Würfel-Knopf und keine Wurf-Taste — das Spiel startete und war dann eine Sackgasse.
Die Ursache steht in einer Zeile, die überall so aussieht:
set_anchors_and_offsets_preset(PRESET_BOTTOM_WIDE, PRESET_MODE_MINSIZE)
PRESET_BOTTOM_WIDE setzt die Offsets aus der Höhe zum Aufrufzeitpunkt.
Im MINSIZE-Modus ist das die minimale Grösse — und die war null, weil
custom_minimum_size erst in der Zeile danach gesetzt wurde.
Eine Leiste mit Höhe null, unten verankert, sitzt also exakt auf der Kante. Ihr Inhalt wächst danach nach unten. Beide Leisten standen komplett unter dem sichtbaren Bereich.
Nicht behoben durch „das Preset später aufrufen“. Das hätte funktioniert
und wäre die kürzeste Änderung gewesen — und beim nächsten Umbau hätte jemand
die Reihenfolge wieder vertauscht, ohne zu wissen, dass sie eine trägt. Der
Anker steht jetzt ausdrücklich (anker_unten), die Höhe kommt aus dem Inhalt,
und minimum_size_changed zieht sie nach. Es gibt keine Reihenfolge mehr, die
man falsch machen kann.
Was beide Fehler gemeinsam haben
Eine Grösse war zu einem Zeitpunkt null, an dem der Code sie schon brauchte. Einmal war es die Trefferfläche eines unsichtbaren Containers, einmal die Höhe einer Leiste. In beiden Fällen ist die geschriebene Zeile richtig — sie steht nur an der falschen Stelle in der Zeit.
Das ist der Fehlertyp, den ein Blick in den Quelltext nicht findet. Man findet ihn, indem man das Ding startet und anfasst.
Und noch etwas kam am selben Tag heraus
Die Kamera passte sich an einen Kasten an, aber nicht an seine Ecken.
Hochkant fielen die Klappen 1, 2, 8 und 9 aus dem Bild — an den Rändern, wo
niemand als Erstes hinschaut, und genau die Klappen, die man am Anfang einer
Runde braucht. _fit_eye rechnet jetzt gegen die acht Eckpunkte des Kastens.
Dazu ein Knopf, den es formal gab und faktisch nie: „Zuklappen“ war immer deaktiviert, weil jede gültige Auswahl ohnehin sofort ausgeführt wurde. Ein Knopf, der nie klickbar ist, ist kein Knopf — er ist eine Behauptung. Er ist jetzt ein echter.
Die Prüfläufe haben von alledem nichts gemeldet. Sie riefen die Spielfunktionen direkt auf und waren grün, während das Spiel unbedienbar war. Das ist die Lehre des zweiten Tages, und sie kam einen Monat später noch einmal zurück — als am Telefon jeder Fingertipp doppelt zählte.