Tilemap: Zugriff aus Behaviors zur Laufzeit (Zelle abfragen und setzen) #135

Closed
opened 2026-09-18 08:03:56 +02:00 by meleki · 2 comments
Owner

Aufgefallen beim Durchsehen von #128: Zur Laufzeit wird eine Tilemap nur gezeichnet. Kein Behavior kann sie lesen oder ändern.

Befund

  • In src/runtime und in den Graph-Nodes (src/core/graph/nodes/) gibt es keinen Bezug zur Tilemap.
  • Typische Spiel-Logik fällt damit weg: „auf welchem Tile stehe ich“, eine Tür öffnen, Gras abmähen, eine Brücke bauen.

Zu bauen

  • Nodes im Behavior-Graph, zum Beispiel:
    • Tile at (Tilemap, Layer, Zelle → Tile-Id bzw. leer)
    • Set tile (Tilemap, Layer, Zelle, Tile, leer = löschen)
    • World → cell und Cell → world, damit man von einer Figurposition auf die Zelle kommt
  • Nach Set tile wird die Karte neu gezeichnet, Autotile-Kanten der Nachbarn inklusive.
  • Laufzeitänderungen verändern das Projekt nicht. Nach Stop ist die Karte wieder so, wie sie gemalt wurde.
  • Tests: Unit-Tests für die Umrechnung Welt ↔ Zelle (mit gedrehter/skalierter Tilemap), e2e mit einem Behavior, das zur Laufzeit ein Tile setzt und liest.

Offen (mit Vorschlag)

  • Layer benennen: über den Layer-Namen oder den Index? Vorschlag: Name, mit Auswahl im Node. Der Index verschiebt sich beim Umsortieren.
  • Mehrere Platzierungen derselben Tilemap: Die Zellen hängen am Asset, nicht an der Platzierung. Ändert Set tile alle Platzierungen oder nur die eine? Vorschlag: nur die eine, die Laufzeit hält dafür eine eigene Kopie der Zellen.
  • Kollision: Wenn #132 (Kollision) vorher kommt, baut Set tile auch die Kollisionsformen neu.

held-back, bis es eingeplant wird.

Aufgefallen beim Durchsehen von #128: Zur Laufzeit wird eine Tilemap nur gezeichnet. Kein Behavior kann sie lesen oder ändern. ## Befund - In `src/runtime` und in den Graph-Nodes (`src/core/graph/nodes/`) gibt es keinen Bezug zur Tilemap. - Typische Spiel-Logik fällt damit weg: „auf welchem Tile stehe ich“, eine Tür öffnen, Gras abmähen, eine Brücke bauen. ## Zu bauen - **Nodes** im Behavior-Graph, zum Beispiel: - `Tile at` (Tilemap, Layer, Zelle → Tile-Id bzw. leer) - `Set tile` (Tilemap, Layer, Zelle, Tile, leer = löschen) - `World → cell` und `Cell → world`, damit man von einer Figurposition auf die Zelle kommt - Nach `Set tile` wird die Karte neu gezeichnet, Autotile-Kanten der Nachbarn inklusive. - **Laufzeitänderungen verändern das Projekt nicht.** Nach Stop ist die Karte wieder so, wie sie gemalt wurde. - Tests: Unit-Tests für die Umrechnung Welt ↔ Zelle (mit gedrehter/skalierter Tilemap), e2e mit einem Behavior, das zur Laufzeit ein Tile setzt und liest. ## Offen (mit Vorschlag) - **Layer benennen:** über den Layer-Namen oder den Index? Vorschlag: **Name**, mit Auswahl im Node. Der Index verschiebt sich beim Umsortieren. - **Mehrere Platzierungen derselben Tilemap:** Die Zellen hängen am Asset, nicht an der Platzierung. Ändert `Set tile` alle Platzierungen oder nur die eine? Vorschlag: **nur die eine**, die Laufzeit hält dafür eine eigene Kopie der Zellen. - **Kollision:** Wenn #132 (Kollision) vorher kommt, baut `Set tile` auch die Kollisionsformen neu. `held-back`, bis es eingeplant wird.
meleki added the held-back label 2026-09-18 08:03:56 +02:00
admin removed the held-back label 2026-09-18 08:16:13 +02:00
admin added this to the Development project 2026-09-18 08:26:24 +02:00
admin moved this to Next in Development on 2026-09-18 08:26:59 +02:00
admin added the low-priority label 2026-09-18 08:27:28 +02:00
admin moved this to Queue in Development on 2026-09-18 08:27:37 +02:00
admin added the question label 2026-09-20 13:37:53 +02:00
admin removed the low-priority label 2026-09-21 08:09:32 +02:00
admin moved this to Next in Development on 2026-09-22 09:25:48 +02:00
  1. name passt, dein vorschlag
  2. dein vorschlag, nur ein tile
  3. #132 steht, somit kann kollision neu gebaut werden
1. name passt, dein vorschlag 2. dein vorschlag, nur ein tile 3. #132 steht, somit kann kollision neu gebaut werden
admin removed the question label 2026-09-22 20:36:41 +02:00
Author
Owner

Umgesetzt in d444b27, Wiki 990f512 (Tilemaps → „From a behavior“, Behaviors).

Die drei Antworten von oben sind so umgesetzt: Layer über den Namen, nur die eine Platzierung ändert sich, die Kollision wird neu gebaut.

Neue Nodes

  • Tile at – liefert tile und empty einer Zelle. Ein Set tile weiter vorne im selben Ablauf ist schon sichtbar.
  • Set tile – setzt ein Tile, ohne Tile wird die Zelle geleert. done meldet, ob es geklappt hat.
  • World to cell / Cell to world – auch bei verschobener, gedrehter, skalierter oder gespiegelter Karte. inside sagt, ob die Zelle im Raster liegt.
  • Tile – konstantes Tile, damit ein Graph ein gelesenes Tile vergleichen kann („steht hier eine Tür?“).
  • Der Layer wird aus den Layer-Namen aller Tilemaps gewählt, „First layer“ nimmt den ersten der jeweiligen Karte. Als Eingang kann auch ein Text hineinlaufen.

Laufzeit

  • Jede Platzierung merkt sich nur ihre geänderten Zellen über den Zellen des Assets. Eine zweite Platzierung derselben Karte bleibt unberührt.
  • Gezeichnet wird sofort, Autotile-Kanten der Nachbarn passen sich an.
  • Ein Move im selben Frame trifft die neue Zelle schon, Rapier baut die Formen im nächsten Step neu.
  • Nach Stop ist die Karte wieder wie gemalt. Der Editor-Run zeigt die Änderung in der Scene View, ins Projekt wird nichts geschrieben.
  • Unverbundener tilemap-Eingang = keine Karte (wie bei Get position). Zellen außerhalb des Rasters werden abgelehnt (done = false).

Tests

  • ./check.sh: 155 Dateien, 2271 Tests, grün (vorher 2245). Neu: tests/core/tile-access.test.ts (14), ein Physik-Test mit einem zur Laufzeit gesetzten Boden, Katalog-Einträge.
  • e2e 39,40: 86 Checks grün (vorher 81), 5 neue in 40s.
  • Vier Gegenproben greifen jeweils genau an ihren Checks.
  • Check-Summe 1351 + 5 = 1356, gerechnet. Der CI-Lauf zu d444b27 ist noch nicht abgewartet.
Umgesetzt in d444b27, Wiki 990f512 (*Tilemaps* → „From a behavior“, *Behaviors*). Die drei Antworten von oben sind so umgesetzt: Layer über den Namen, nur die eine Platzierung ändert sich, die Kollision wird neu gebaut. **Neue Nodes** - `Tile at` – liefert `tile` und `empty` einer Zelle. Ein `Set tile` weiter vorne im selben Ablauf ist schon sichtbar. - `Set tile` – setzt ein Tile, ohne Tile wird die Zelle geleert. `done` meldet, ob es geklappt hat. - `World to cell` / `Cell to world` – auch bei verschobener, gedrehter, skalierter oder gespiegelter Karte. `inside` sagt, ob die Zelle im Raster liegt. - `Tile` – konstantes Tile, damit ein Graph ein gelesenes Tile vergleichen kann („steht hier eine Tür?“). - Der Layer wird aus den Layer-Namen aller Tilemaps gewählt, „First layer“ nimmt den ersten der jeweiligen Karte. Als Eingang kann auch ein Text hineinlaufen. **Laufzeit** - Jede Platzierung merkt sich nur ihre geänderten Zellen über den Zellen des Assets. Eine zweite Platzierung derselben Karte bleibt unberührt. - Gezeichnet wird sofort, Autotile-Kanten der Nachbarn passen sich an. - Ein `Move` im selben Frame trifft die neue Zelle schon, Rapier baut die Formen im nächsten Step neu. - Nach Stop ist die Karte wieder wie gemalt. Der Editor-Run zeigt die Änderung in der Scene View, ins Projekt wird nichts geschrieben. - Unverbundener `tilemap`-Eingang = keine Karte (wie bei `Get position`). Zellen außerhalb des Rasters werden abgelehnt (`done` = false). **Tests** - `./check.sh`: 155 Dateien, 2271 Tests, grün (vorher 2245). Neu: `tests/core/tile-access.test.ts` (14), ein Physik-Test mit einem zur Laufzeit gesetzten Boden, Katalog-Einträge. - e2e 39,40: 86 Checks grün (vorher 81), 5 neue in 40s. - Vier Gegenproben greifen jeweils genau an ihren Checks. - Check-Summe 1351 + 5 = 1356, gerechnet. Der CI-Lauf zu d444b27 ist noch nicht abgewartet.
admin moved this to Done in Development on 2026-09-23 21:56:36 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#135