Folge-Issue zu #132 (Stufe 3 der Tilemap-Kollision). Stufe 2, die Kollisionsgröße pro Tile, steht in #140.
Befund
Kollision kennt nur zwei Formen: box und circle (ColliderShape, src/core/properties/collider.ts:15). Überlappung (shapesOverlap) und Anhalten an der Wand (exitDistance) sind genau für diese Paare geschrieben: Box/Box über getrennte Achsen, Kreis/Kreis, Box/Kreis.
Im Texture-Tab legt man Frames als Rechtecke an, dazu gibt es pro Frame die Nine-Slice-Ränder (border, fill an TextureFrame, src/core/model/Asset.ts:80). Eine Kollisionsform am Frame gibt es nicht.
Eine Tilemap-Zelle blockiert seit #132 immer als Rechteck. Schräge Kanten, runde Felsen oder ein Baumstamm im Tile sind so nicht abzubilden.
Zu bauen
Neue Ebene im Texture-Tab: „Collision" neben den Frames. Ist sie aktiv, zeichnet man für den ausgewählten Frame ein Polygon: Punkte setzen, verschieben, einfügen (Klick auf eine Kante), löschen. Jeder Schritt ist ein Undo-Schritt. Die Punkte liegen in Pixeln relativ zum Frame, so wandern sie mit, wenn der Frame verschoben wird.
Das Polygon wird mit dem Frame gespeichert und beim Laden wie die übrigen Frame-Felder nachsichtig gelesen (kaputte Punkte fallen weg, zu wenige Punkte = kein Polygon).
Neuer Formtyp polygon im CollisionSystem, mit Überlappung und exitDistance gegen Box, Kreis und Polygon. Konkave Polygone werden intern in konvexe Teile zerlegt.
Tilemap: Hat das Bild eines Solid-Tiles ein Polygon, blockiert die Zelle mit diesem Polygon statt mit der ganzen Zelle. Zellen ohne Polygon werden weiter zu Rechtecken zusammengefasst wie bisher.
Scene-View: Die Polygone werden wie die übrigen Kollisionsformen umrandet.
Tests: Unit-Tests für die neue Form (Überlappung, Anhalten, Gleiten an einer Schräge, konkav zerlegt), für Speichern und Laden, für die Polygon-Kommandos mit Undo. e2e: Polygon im Texture-Tab zeichnen, eine Figur hält an der Schräge.
Offen (mit Vorschlag)
Welche Tiles? Ein Floor- oder Wall-Tile setzt sich aus Viertelkacheln eines ganzen Blocks zusammen, dort gehört ein Polygon zu keinem einzelnen Frame. Vorschlag: Polygone gelten zuerst nur für None (1 × 1)-Tiles, deren Bild ein Frame ist. Autotiles blockieren weiter als Rechteck.
Animierte Tiles: Jedes Bild ist ein Frame und könnte ein eigenes Polygon haben. Vorschlag: es zählt das Polygon des ersten Bildes. Eine Kollision, die mit der Animation zuckt, ist selten gewollt.
Verhältnis zu #140: Vorschlag: Die Kollisionsgröße skaliert auch das Polygon, um die Zellmitte. Polygone werden nicht mit Nachbarn verschmolzen, jede Zelle bringt ihr eigenes mit.
Auch für platzierte Sprites? Ein Objekt mit diesem Frame könnte dasselbe Polygon als Collider nutzen (Collider-Form „Frame polygon"). Vorschlag: nicht in diesem Issue, eigenes Folge-Issue, wenn gewünscht.
Konvex erzwingen statt zerlegen? Einfacher, aber für Felsen und Bäume zu eng. Vorschlag: zerlegen, selbstüberschneidende Polygone werden abgelehnt und im Tab rot markiert.
Folge-Issue zu #132 (Stufe 3 der Tilemap-Kollision). Stufe 2, die Kollisionsgröße pro Tile, steht in #140.
## Befund
- Kollision kennt nur zwei Formen: `box` und `circle` (`ColliderShape`, `src/core/properties/collider.ts:15`). Überlappung (`shapesOverlap`) und Anhalten an der Wand (`exitDistance`) sind genau für diese Paare geschrieben: Box/Box über getrennte Achsen, Kreis/Kreis, Box/Kreis.
- Im Texture-Tab legt man Frames als Rechtecke an, dazu gibt es pro Frame die Nine-Slice-Ränder (`border`, `fill` an `TextureFrame`, `src/core/model/Asset.ts:80`). Eine Kollisionsform am Frame gibt es nicht.
- Eine Tilemap-Zelle blockiert seit #132 immer als Rechteck. Schräge Kanten, runde Felsen oder ein Baumstamm im Tile sind so nicht abzubilden.
## Zu bauen
- **Neue Ebene im Texture-Tab: „Collision"** neben den Frames. Ist sie aktiv, zeichnet man für den ausgewählten Frame ein **Polygon**: Punkte setzen, verschieben, einfügen (Klick auf eine Kante), löschen. Jeder Schritt ist ein Undo-Schritt. Die Punkte liegen in Pixeln relativ zum Frame, so wandern sie mit, wenn der Frame verschoben wird.
- Das Polygon wird mit dem Frame gespeichert und beim Laden wie die übrigen Frame-Felder nachsichtig gelesen (kaputte Punkte fallen weg, zu wenige Punkte = kein Polygon).
- **Neuer Formtyp `polygon` im `CollisionSystem`**, mit Überlappung und `exitDistance` gegen Box, Kreis und Polygon. Konkave Polygone werden intern in konvexe Teile zerlegt.
- **Tilemap:** Hat das Bild eines Solid-Tiles ein Polygon, blockiert die Zelle mit diesem Polygon statt mit der ganzen Zelle. Zellen ohne Polygon werden weiter zu Rechtecken zusammengefasst wie bisher.
- Scene-View: Die Polygone werden wie die übrigen Kollisionsformen umrandet.
- Tests: Unit-Tests für die neue Form (Überlappung, Anhalten, Gleiten an einer Schräge, konkav zerlegt), für Speichern und Laden, für die Polygon-Kommandos mit Undo. e2e: Polygon im Texture-Tab zeichnen, eine Figur hält an der Schräge.
## Offen (mit Vorschlag)
- **Welche Tiles?** Ein Floor- oder Wall-Tile setzt sich aus Viertelkacheln eines ganzen Blocks zusammen, dort gehört ein Polygon zu keinem einzelnen Frame. Vorschlag: Polygone gelten zuerst nur für **None (1 × 1)**-Tiles, deren Bild ein Frame ist. Autotiles blockieren weiter als Rechteck.
- **Animierte Tiles:** Jedes Bild ist ein Frame und könnte ein eigenes Polygon haben. Vorschlag: es zählt das Polygon des **ersten** Bildes. Eine Kollision, die mit der Animation zuckt, ist selten gewollt.
- **Verhältnis zu #140:** Vorschlag: Die Kollisionsgröße skaliert auch das Polygon, um die Zellmitte. Polygone werden nicht mit Nachbarn verschmolzen, jede Zelle bringt ihr eigenes mit.
- **Auch für platzierte Sprites?** Ein Objekt mit diesem Frame könnte dasselbe Polygon als Collider nutzen (Collider-Form „Frame polygon"). Vorschlag: nicht in diesem Issue, eigenes Folge-Issue, wenn gewünscht.
- **Konvex erzwingen statt zerlegen?** Einfacher, aber für Felsen und Bäume zu eng. Vorschlag: **zerlegen**, selbstüberschneidende Polygone werden abgelehnt und im Tab rot markiert.
32057a9 – erste Fassung: ein Kollisions-Umriss pro Frame, bearbeitet im Texture-Tab mit dem Umschalter Collision. Eine einfache Tile blockiert mit dem Umriss ihres ersten Bilds statt mit ihrem Rechteck, die Collision Scale skaliert ihn um die Zellmitte. Autotiles blockierten dort noch als Rechteck.
947a6b1 – Überarbeitung für Autotiles, weil ein Umriss pro Frame bei ihnen nicht passen kann (eine Autotile-Zelle wird aus vier Vierteln des Blocks zusammengesetzt, nie aus einem Frame).
Wie es jetzt funktioniert
Mehrere Umrisse pro Frame (Texture-Tab, Collision an):
Klick setzt eine Ecke an den aktiven Umriss.
Ctrl/Cmd-Klick beginnt einen neuen Umriss.
Klick auf Ecke, Kante oder Fläche eines anderen Umrisses macht diesen aktiv (dicker gezeichnet, helle Griffe).
Delete entfernt den aktiven Umriss, im Collision-Modus nie den Frame.
Ecken ziehen, auf Kante einfügen, per Doppelklick löschen wie bei den Polygon-Collidern aus #151.
Autotiles: Die Umrisse werden über den ganzen Block gezeichnet. Sie werden an den Vierteln zerschnitten (Sutherland-Hodgman), und jede Zelle bekommt die Stücke genau der Viertel, aus denen ihr Bild besteht. Kanten, Außenecken und Kerben ergeben sich damit automatisch.
Tile des Blocks ohne Zeichnung → ihre Viertel blockieren voll. Das Kreuz für die Kerben muss also nicht gezeichnet werden, Innenecken bleiben zu. Sobald in einer Tile etwas gezeichnet ist, zählt dort nur das, so lässt sich ein Viertel absichtlich offen lassen.
Zellen aus lauter vollen Vierteln werden wieder zu Rechtecken zusammengefasst.
Die Collision Scale gilt nicht für eine Autotile mit Umriss, dort gibt der Umriss die Form vor. Ohne Umriss bleibt es beim Rechteck mit Scale.
Das Format der ersten Fassung (ein Umriss als flache Liste) wird beim Laden weiter gelesen.
Tests
npm run check: 106 Files, 1508 Tests (vorher 1501), grün.
Neue Unit-Tests u. a.: See aus 3 × 3 Zellen (auf einem Messraster geprüft: blockiert genau 2,25–4,75, rundum eine Viertel-Zelle eingerückt), Ring um ein leeres Feld (Kerbe ohne Zeichnung blockiert, mit Zeichnung in derselben Tile bleibt sie offen), eine Kiste gleitet am Ufer von 12 See-Zellen 80 Schritte lang exakt gleichmäßig und bündig ohne Haken – in beiden Systemen; dazu mehrere Umrisse pro Frame, altes Format, Autotile ohne Umriss.
Gegenprobe: 6 eingebaute Fehler, alle gefangen.
e2e 42c prüft neues Format, Ctrl-Klick und Delete im Browser (+1 Check, Summe 1068). Lokal GM_STEPS=39,40,41,42 → ALL PASSED – 94 checks.
Vom User selbst im Editor getestet.
CI zu 947a6b1 lief beim Schreiben dieses Kommentars noch; die Summe 1068 ist gerechnet, das Ergebnis trage ich nach.
Bekannt
Im Scene-View werden Ufer-Zellen als einzelne Viertel-Stücke umrandet, an den Viertel-Grenzen sieht man kleine Querstriche. Auf die Kollision hat das keinen Einfluss.
Doku: Wiki-Seiten Textures, Tilemaps, Tiles, Architecture, Development (93a5641).
Umgesetzt in zwei Commits:
- **`32057a9`** – erste Fassung: ein Kollisions-Umriss pro Frame, bearbeitet im Texture-Tab mit dem Umschalter **Collision**. Eine einfache Tile blockiert mit dem Umriss ihres ersten Bilds statt mit ihrem Rechteck, die Collision Scale skaliert ihn um die Zellmitte. Autotiles blockierten dort noch als Rechteck.
- **`947a6b1`** – Überarbeitung für Autotiles, weil ein Umriss pro Frame bei ihnen nicht passen kann (eine Autotile-Zelle wird aus vier Vierteln des Blocks zusammengesetzt, nie aus einem Frame).
## Wie es jetzt funktioniert
**Mehrere Umrisse pro Frame** (Texture-Tab, Collision an):
- Klick setzt eine Ecke an den aktiven Umriss.
- Ctrl/Cmd-Klick beginnt einen neuen Umriss.
- Klick auf Ecke, Kante oder Fläche eines anderen Umrisses macht diesen aktiv (dicker gezeichnet, helle Griffe).
- `Delete` entfernt den aktiven Umriss, im Collision-Modus nie den Frame.
- Ecken ziehen, auf Kante einfügen, per Doppelklick löschen wie bei den Polygon-Collidern aus #151.
**Autotiles:** Die Umrisse werden über den ganzen Block gezeichnet. Sie werden an den Vierteln zerschnitten (Sutherland-Hodgman), und jede Zelle bekommt die Stücke genau der Viertel, aus denen ihr Bild besteht. Kanten, Außenecken und Kerben ergeben sich damit automatisch.
- **Tile des Blocks ohne Zeichnung** → ihre Viertel blockieren voll. Das Kreuz für die Kerben muss also nicht gezeichnet werden, Innenecken bleiben zu. Sobald in einer Tile etwas gezeichnet ist, zählt dort nur das, so lässt sich ein Viertel absichtlich offen lassen.
- Zellen aus lauter vollen Vierteln werden wieder zu Rechtecken zusammengefasst.
- Die Collision Scale gilt nicht für eine Autotile mit Umriss, dort gibt der Umriss die Form vor. Ohne Umriss bleibt es beim Rechteck mit Scale.
- Das Format der ersten Fassung (ein Umriss als flache Liste) wird beim Laden weiter gelesen.
## Tests
- `npm run check`: 106 Files, 1508 Tests (vorher 1501), grün.
- Neue Unit-Tests u. a.: See aus 3 × 3 Zellen (auf einem Messraster geprüft: blockiert genau 2,25–4,75, rundum eine Viertel-Zelle eingerückt), Ring um ein leeres Feld (Kerbe ohne Zeichnung blockiert, mit Zeichnung in derselben Tile bleibt sie offen), eine Kiste gleitet am Ufer von 12 See-Zellen 80 Schritte lang exakt gleichmäßig und bündig ohne Haken – in beiden Systemen; dazu mehrere Umrisse pro Frame, altes Format, Autotile ohne Umriss.
- Gegenprobe: 6 eingebaute Fehler, alle gefangen.
- e2e 42c prüft neues Format, Ctrl-Klick und `Delete` im Browser (+1 Check, Summe 1068). Lokal `GM_STEPS=39,40,41,42` → ALL PASSED – 94 checks.
- Vom User selbst im Editor getestet.
- CI zu `947a6b1` lief beim Schreiben dieses Kommentars noch; die Summe 1068 ist gerechnet, das Ergebnis trage ich nach.
## Bekannt
Im Scene-View werden Ufer-Zellen als einzelne Viertel-Stücke umrandet, an den Viertel-Grenzen sieht man kleine Querstriche. Auf die Kollision hat das keinen Einfluss.
Doku: Wiki-Seiten Textures, Tilemaps, Tiles, Architecture, Development (`93a5641`).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Folge-Issue zu #132 (Stufe 3 der Tilemap-Kollision). Stufe 2, die Kollisionsgröße pro Tile, steht in #140.
Befund
boxundcircle(ColliderShape,src/core/properties/collider.ts:15). Überlappung (shapesOverlap) und Anhalten an der Wand (exitDistance) sind genau für diese Paare geschrieben: Box/Box über getrennte Achsen, Kreis/Kreis, Box/Kreis.border,fillanTextureFrame,src/core/model/Asset.ts:80). Eine Kollisionsform am Frame gibt es nicht.Zu bauen
polygonimCollisionSystem, mit Überlappung undexitDistancegegen Box, Kreis und Polygon. Konkave Polygone werden intern in konvexe Teile zerlegt.Offen (mit Vorschlag)
Umgesetzt in zwei Commits:
32057a9– erste Fassung: ein Kollisions-Umriss pro Frame, bearbeitet im Texture-Tab mit dem Umschalter Collision. Eine einfache Tile blockiert mit dem Umriss ihres ersten Bilds statt mit ihrem Rechteck, die Collision Scale skaliert ihn um die Zellmitte. Autotiles blockierten dort noch als Rechteck.947a6b1– Überarbeitung für Autotiles, weil ein Umriss pro Frame bei ihnen nicht passen kann (eine Autotile-Zelle wird aus vier Vierteln des Blocks zusammengesetzt, nie aus einem Frame).Wie es jetzt funktioniert
Mehrere Umrisse pro Frame (Texture-Tab, Collision an):
Deleteentfernt den aktiven Umriss, im Collision-Modus nie den Frame.Autotiles: Die Umrisse werden über den ganzen Block gezeichnet. Sie werden an den Vierteln zerschnitten (Sutherland-Hodgman), und jede Zelle bekommt die Stücke genau der Viertel, aus denen ihr Bild besteht. Kanten, Außenecken und Kerben ergeben sich damit automatisch.
Tests
npm run check: 106 Files, 1508 Tests (vorher 1501), grün.Deleteim Browser (+1 Check, Summe 1068). LokalGM_STEPS=39,40,41,42→ ALL PASSED – 94 checks.947a6b1lief beim Schreiben dieses Kommentars noch; die Summe 1068 ist gerechnet, das Ergebnis trage ich nach.Bekannt
Im Scene-View werden Ufer-Zellen als einzelne Viertel-Stücke umrandet, an den Viertel-Grenzen sieht man kleine Querstriche. Auf die Kollision hat das keinen Einfluss.
Doku: Wiki-Seiten Textures, Tilemaps, Tiles, Architecture, Development (
93a5641).Nachtrag CI zu
947a6b1(aus den Job-Logs gelesen):CHECK EXIT 0ALL PASSED – 1068 checks— die Summe 1068 ist damit gemessen