Zum Inhalt springen
Pipfold

Vier Stufen, bis der Kasten im Raum stand — ohne eine einzige Bilddatei

· gestaltung · spiel

Nach vier Tagen war Pipfold spielbar und sah aus wie ein Prototyp: flache Brettchen, eine Sonne, überall dieselbe Oberfläche. Aus der Design-Durchsicht wurden vier Stufen, an zwei Tagen gebaut. Keine davon hat eine Bilddatei ins Paket gelegt.

Der Kasten vor der Durchsicht: flache Farbflächen, das Holz in einem einzigen Braun, der Filz ein gleichmässiges Grün ohne Struktur. Die Klappen sind schmucklose Rechtecke mit sehr grossen schwarzen Ziffern, die wie aufgedruckt wirken. Die Würfel haben scharfe Kanten und flache Punkte, dahinter ein leerer brauner Hintergrund.
vor Stufe 126. Juli. Ein Braun, ein Grün, scharfe Kanten. Zwischen Wanne, Wangen und Klappen unterscheidet nur die Farbe.
Derselbe Kasten nach den vier Stufen: sichtbare Holzmaserung mit Jahresringen je Brett, dunkle Stossfugen an den Ecken, gefaste Kanten mit Lichtlinie, Schattenfugen zwischen den Klappen, beleuchtete Ziffern, versenkte Würfelaugen mit Kontaktschatten, ein abgedunkelter Saum um die Wanne und eine Vignette an den Bildrändern.
nach Stufe 4Derselbe Kamerawinkel, dieselbe Auflösung. Alles Material ist gerechnet — im Paket liegt kein einziges Bild.

Beide Aufnahmen kommen aus demselben Werkzeug (tools/schuesse.sh, Schuss spiel, 1280×720), das linke aus einem ausgecheckten Stand vom 26. Juli.

Stufe 1 — die billigen fünf Punkte

Zuerst das, was nichts kostet ausser Aufmerksamkeit:

Hochkant lief ein harter Streifen quer durchs Bild. Das war die Kante zwischen Tisch und Rückwand — eine Wand, die es nur gab, weil ein Raum eine Wand hat. Sie ist raus, der Tisch wurde 16×16 Einheiten gross und nach hinten gezogen, der Nebel dichter. Was hinten liegt, verschwindet jetzt, statt an einer Linie aufzuhören.

Der Turnierstand stand als 0:0:0:0 da und liest sich jetzt als „Anna 2 · Ben 1“. Leer bleibt leer, statt Nullen zu zeigen.

Und das Holz wurde zum ersten Mal differenziert: helle Oberkanten, mittlere Wangen, dunkle Innenblenden. Drei Töne, wo vorher einer war — das allein macht aus einem Klotz einen zusammengesetzten Kasten.

Dazu zog scripts/stil.gd rund 34 verstreute Farbwerte an eine Stelle.

Stufe 2 — Licht in drei Rollen

Vorher: eine Sonne plus ein Füller. Jetzt drei Lichter mit verschiedenen Aufgaben — warmes Hauptlicht von vorn links, kühles Gegenlicht von hinten rechts ohne Schatten, das eine helle Kante auf Klappen und Würfel zieht, und ein warmer Füller vorn.

Der wichtigste Zugewinn war aber ein anderer: Kontaktschatten unter den Würfeln. Eine flach liegende Fläche mit weichem Radialverlauf, die dem Würfel in x und z folgt und beim Wurf mit der Flughöhe wächst und verblasst.

Das ist die Information, die „schwebt“ von „liegt“ unterscheidet. Der Schlagschatten der Sonne allein lässt kleine Dinge schweben — er ist zu weit weg vom Objekt, um zu sagen, wie hoch es steht.

Dazu Rauheit je Oberfläche: Filz 0,97 matt, Wangen 0,60, Oberkanten 0,48, Klappen 0,44 lackiert, Würfel 0,34. Vorher hatten alle Flächen denselben Wert — dadurch sahen Filz, Holz und Bein aus wie derselbe Stoff in drei Farben.

Gelernt: Eine GradientTexture2D direkt als albedo_texture bleibt im Compatibility-Renderer unsichtbar. Die Fläche wird gezeichnet, die Textur aber nie gebunden. ImageTexture.create_from_image() behebt es. Eine halbe Stunde ging dafür drauf, den Verlauf zu suchen, den es gar nicht gab.

Stufe 3 — das Holz wird gerechnet

shaders/holz.gdshader: Jahresringe um eine Stammachse, die in Faserrichtung durch das Werkstück läuft, plus gestauchtes Feinrauschen für die Längsfasern.

Der Punkt, an dem es kippt: Jedes Brett bekommt eine eigene Stammlage, fest gesät, damit die Optik bei jedem Start gleich ist. Ohne das laufen die Ringe über die Fugen hinweg durch — und der Kasten sieht aus, als wäre er aus einem Klotz gefräst statt aus Brettern gebaut. Die Faserrichtung folgt dem Bauteil: längs bei den Leisten, quer bei den Wangen, senkrecht bei den Klappen.

Dazu kam:

Und dann gemessen

Die Tischplatte füllt den ganzen Hintergrund, jeder Pixel läuft durch den Shader. Also nachgerechnet, bevor er bleiben durfte: bei 2560×1440 kostet er 0,13 ms pro Bild — 4,44 gegen 4,32 ohne. Dafür ohne sin() im Rauschen, zwei Oktaven statt drei, und die Feinfaser ist abschaltbar. Tischplatte und Innenblenden brauchen sie nicht.

Gelernt: Die Scharnierstange lag zuerst im Array _klappen — das ist nach Klappennummer indiziert, und über seine Grösse entscheidet der Neuaufbau des Klappenkamms. Sie hätte bei jedem Zug den ganzen Kamm neu bauen lassen. Die UI-Prüfung hat es sofort gefangen: „Klappe hängt nach unten“.

Stufe 4 — der Kasten wird ein Ding im Raum

Ausgangspunkt war ein Blick auf das Querformat: der Kasten lag als flaches Band in der Bildmitte, oben und unten ein Drittel leeres Dunkel, die Ziffern klebten wie aufgedruckt, und die zwei wichtigsten Texte sahen aus wie Debug-Ausgaben.

Die Ziffern sind jetzt beleuchtet (Label3D.shaded). Vorher behielten sie ihre Farbe, während das Holz unter ihnen hell und dunkel wurde — genau daran erkennt das Auge einen Aufkleber. Sie wurden auch kleiner (0,29 → 0,26) und optisch statt rechnerisch zentriert: die „1“ trägt links eine Fahne und sass sichtbar zu weit rechts. Zweistellige Zahlen dafür grösser (0,62 → 0,72), weil 10, 11 und 12 neben den einstelligen mickrig wirkten.

Echte Schattenfuge zwischen den Klappen (Abstand 0,012 → 0,022, Korpus 0,96 → 0,94 der Fachbreite). Vorher las die Reihe aus der Spielsicht als ein einziger Streifen.

Stossfugen an den Ecken — vier dünne dunkle Leisten, keine Geometrieänderung: aus dem Klotz mit Kanten werden vier zusammengesetzte Bretter.

Und die Würfel wurden kleiner: Kantenlänge 0,22 → 0,185. Einer war fast so breit wie eine Klappe. Dazu ein eigener Gierwinkel je Würfel und eine versetzte Ruhelage in der Tiefe — exakt auf einer Linie liegen Würfel nur, wenn jemand sie hingelegt hat.

Die Geometrie, die sich nicht überreden liess

Hochkant bleibt oben rund ein Drittel leerer Tisch, und das ist nicht wegzurechnen. Ein Kasten mit Seitenverhältnis 2,4 zu 1,35 füllt ein Bild mit 0,46 nicht in der Höhe. Drehen um die Hochachse macht ihn im Bild sogar breiter — 2,4·cos + 1,35·sin. 26° wurden ausprobiert und waren schlechter.

Was hilft, ist kein Trick, sondern eine Entscheidung: weiter Blickwinkel aus der Nähe (FOV_HOCH 48°), die vordere Kante darf seitlich aus dem Bild laufen — nur die Klappenreihe muss ganz sichtbar sein — und der Kasten sitzt tiefer. Die Luft liegt oben, wo Punktzahl und Werkzeuge stehen, der Kasten liegt in Daumenreichweite.

Stufe 4 sollte ursprünglich Physik-Würfel bringen — echte Starrkörper statt gerechneter Wurfbahnen. Bewusst liegen gelassen: das kollidiert mit der reproduzierbaren Wurffolge, und die braucht das Spiel für „gleiche Würfel für alle“ und für die Prüfläufe. Ein Würfel, der bei jedem Start anders fällt, ist realistischer und macht jede Zusicherung unprüfbar.

Was von den vier Stufen übrig bleibt

Im ausgelieferten Paket liegt kein einziges Bild für all das. Maserung, Filzstruktur, Kontaktschatten, Vignette, Prägung, Stossfugen — alles zur Laufzeit erzeugt oder aus Geometrie gebaut.

Das war kein Sparzwang. Es ist der Grund, warum das Spiel 14 MB gross ist und nicht 140 — und warum eine vierte Garnitur zwei Farbwerte kostet statt einer Texturserie.

← Devlog