Physik: Collider-Form „Frame outline“ – Umrisse des Frames für platzierte Sprites #161

Closed
opened 2026-09-19 11:41:51 +02:00 by meleki · 2 comments
Owner

Aus #141 (offener Punkt „Auch für platzierte Sprites?“, dort: „nicht in diesem Issue, eigenes Folge-Issue, wenn gewünscht“).

Befund

  • Seit #141 kann ein Frame im Texture-Tab mehrere Kollisions-Umrisse haben. Genutzt werden sie nur von der Tilemap.
  • Ein platziertes Sprite mit diesem Frame braucht heute einen eigenen Collider, dessen Polygon (#151) man noch einmal von Hand nachzeichnet.

Zu bauen (Vorschlag)

  • Neue Collider-Form Frame outline: Der Collider übernimmt die Umrisse des aktuellen Frames seines Sprites, skaliert auf die Sprite-Größe, gedreht und gespiegelt mit dem Objekt.
  • Mehrere Umrisse werden zu mehreren Teilen desselben Colliders (wie konkave Polygone in #151).
  • Tests: gleiche Kollision wie ein von Hand gleich gezeichnetes Polygon, in beiden Systemen.

Offen (mit Vorschlag)

  1. Animierte Sprites: Umriss des aktuellen Frames oder immer des ersten? Vorschlag: erster Frame wie bei den Tiles; Wechsel pro Frame würde den Rapier-Collider ständig neu bauen.
  2. Frame ohne Umriss: Vorschlag: volles Rechteck des Frames.
Aus #141 (offener Punkt „Auch für platzierte Sprites?“, dort: „nicht in diesem Issue, eigenes Folge-Issue, wenn gewünscht“). ## Befund - Seit #141 kann ein Frame im Texture-Tab mehrere Kollisions-Umrisse haben. Genutzt werden sie nur von der Tilemap. - Ein platziertes Sprite mit diesem Frame braucht heute einen eigenen Collider, dessen Polygon (#151) man noch einmal von Hand nachzeichnet. ## Zu bauen (Vorschlag) - Neue Collider-Form **Frame outline**: Der Collider übernimmt die Umrisse des aktuellen Frames seines Sprites, skaliert auf die Sprite-Größe, gedreht und gespiegelt mit dem Objekt. - Mehrere Umrisse werden zu mehreren Teilen desselben Colliders (wie konkave Polygone in #151). - Tests: gleiche Kollision wie ein von Hand gleich gezeichnetes Polygon, in beiden Systemen. ## Offen (mit Vorschlag) 1. **Animierte Sprites:** Umriss des aktuellen Frames oder immer des ersten? Vorschlag: erster Frame wie bei den Tiles; Wechsel pro Frame würde den Rapier-Collider ständig neu bauen. 2. **Frame ohne Umriss:** Vorschlag: volles Rechteck des Frames.
meleki added the new label 2026-09-19 11:41:51 +02:00

dieses feautre würde ich komplett verwerfen. stattdessen ein helper der einen automatisch collider erstellt bei einem frame. da ist auch die frage wie genau der collider sein soll (wieviele punkte) - dazu einfach bei texture tab. generate collider... => dialog mit maximale anzahl von punkten (default: 4), dann wird der polygon collider erstellt

dieses feautre würde ich komplett verwerfen. stattdessen ein helper der einen automatisch collider erstellt bei einem frame. da ist auch die frage wie genau der collider sein soll (wieviele punkte) - dazu einfach bei texture tab. generate collider... => dialog mit maximale anzahl von punkten (default: 4), dann wird der polygon collider erstellt
admin removed the new label 2026-09-19 12:39:51 +02:00
admin added this to the Development project 2026-09-19 12:39:55 +02:00
admin added the new label 2026-09-19 12:49:01 +02:00
admin moved this to Next in Development on 2026-09-21 06:54:42 +02:00
admin removed the new label 2026-09-21 06:54:52 +02:00
Author
Owner

Erledigt mit 2d79230 (Code) und Wiki 3d5f892.

Teil 1: Collider aus dem Frame-Umriss

Der ist schon mit #193 (f4ec23d) gekommen, anders als hier ursprünglich geplant: als Collider-Form Frame collision, verknüpft mit dem Frame. Ein Collider dieser Form blockt mit den Umrissen seines Frames, und ändert sich der Umriss im Texture-Tab, ändert sich jeder Collider mit.

Teil 2: der Helfer "Generate collision…"

Im Header des Texture-Tabs gibt es den Knopf Generate collision…. Er ist aus, solange die Textur keine Frames hat.

Zeile Vorgabe
Max points 8 (3 bis 64)
Solid from … % alpha 50
All frames of the texture aus; ohne gewählten Frame an und gesperrt

Darunter steht live, was Generate schreiben wird (z. B. Frame "Left": 2 outlines, 8 corners). Ist nichts fest genug, bleibt der Knopf aus. Vorhandene Umrisse werden ersetzt, und das Ganze ist ein Undo-Schritt, egal ob für einen Frame oder alle.

So entsteht der Umriss:

  • Jede Insel aus festen Pixeln wird entlang der Pixelkanten umfahren.
  • Dann fallen die unwichtigsten Ecken weg, bis höchstens Max points übrig sind und keine Treppenstufe mehr bleibt. Eine Schräge wird so zu einer geraden Kante.
  • Der Umriss kreuzt sich nie selbst. Wo das Bild das erzwingen würde, wird die konvexe Hülle der Insel genommen.
  • Krümel unter 1 % der Frame-Fläche fallen weg, außer es ist die einzige Insel. Löcher werden nicht nachgebildet.

Kleinigkeit: Der Keil im Test-Fixture bekommt 4 Ecken statt 3. Seine Spitze ist im Bild ein Pixel breit, und diese echte Kante bleibt stehen, solange Ecken frei sind.

Tests

./check.sh            → 131 Files, 1941 Tests, CHECK EXIT 0   (vorher 130 / 1931)
npm run build         → BUILD EXIT 0
GM_STEPS=42 (frisch)  → ALL PASSED – 20 checks   (vorher 16)
  • 10 neue Unit-Tests in tests/core/trace-collision.test.ts, darunter 150 Zufallsformen, die alle gültig und im Eckenbudget sein müssen.
  • 4 neue e2e-Checks (Block 42f) über die Oberfläche: Dialog, Alpha-Schwelle, All frames, Undo.
  • Drei Gegenproben greifen: ohne Rückfall auf die Hülle, ohne Treppenschwelle, Dialog ignoriert die Schwelle.
  • Check-Summe 1202 ist gerechnet (1198 + 4), gemessen wird sie im CI-Lauf.

Doku: Wiki Textures (Abschnitt Generate collision…), Architecture, Development.

Erledigt mit `2d79230` (Code) und Wiki `3d5f892`. ## Teil 1: Collider aus dem Frame-Umriss Der ist schon mit #193 (`f4ec23d`) gekommen, anders als hier ursprünglich geplant: als Collider-Form **Frame collision**, verknüpft mit dem Frame. Ein Collider dieser Form blockt mit den Umrissen seines Frames, und ändert sich der Umriss im Texture-Tab, ändert sich jeder Collider mit. ## Teil 2: der Helfer "Generate collision…" Im Header des Texture-Tabs gibt es den Knopf **Generate collision…**. Er ist aus, solange die Textur keine Frames hat. | Zeile | Vorgabe | |---|---| | **Max points** | 8 (3 bis 64) | | **Solid from … % alpha** | 50 | | **All frames of the texture** | aus; ohne gewählten Frame an und gesperrt | Darunter steht live, was **Generate** schreiben wird (z. B. `Frame "Left": 2 outlines, 8 corners`). Ist nichts fest genug, bleibt der Knopf aus. Vorhandene Umrisse werden **ersetzt**, und das Ganze ist **ein Undo-Schritt**, egal ob für einen Frame oder alle. **So entsteht der Umriss:** - Jede Insel aus festen Pixeln wird entlang der Pixelkanten umfahren. - Dann fallen die unwichtigsten Ecken weg, bis höchstens *Max points* übrig sind und keine Treppenstufe mehr bleibt. Eine Schräge wird so zu einer geraden Kante. - Der Umriss kreuzt sich nie selbst. Wo das Bild das erzwingen würde, wird die konvexe Hülle der Insel genommen. - Krümel unter 1 % der Frame-Fläche fallen weg, außer es ist die einzige Insel. Löcher werden nicht nachgebildet. **Kleinigkeit:** Der Keil im Test-Fixture bekommt 4 Ecken statt 3. Seine Spitze ist im Bild ein Pixel breit, und diese echte Kante bleibt stehen, solange Ecken frei sind. ## Tests ``` ./check.sh → 131 Files, 1941 Tests, CHECK EXIT 0 (vorher 130 / 1931) npm run build → BUILD EXIT 0 GM_STEPS=42 (frisch) → ALL PASSED – 20 checks (vorher 16) ``` - 10 neue Unit-Tests in `tests/core/trace-collision.test.ts`, darunter 150 Zufallsformen, die alle gültig und im Eckenbudget sein müssen. - 4 neue e2e-Checks (Block 42f) über die Oberfläche: Dialog, Alpha-Schwelle, All frames, Undo. - Drei Gegenproben greifen: ohne Rückfall auf die Hülle, ohne Treppenschwelle, Dialog ignoriert die Schwelle. - Check-Summe **1202** ist gerechnet (1198 + 4), gemessen wird sie im CI-Lauf. Doku: Wiki *Textures* (Abschnitt *Generate collision…*), *Architecture*, *Development*.
admin moved this to Done in Development on 2026-09-21 08:01:31 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#161