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.
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.
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.
Aufgefallen beim Durchsehen von #128: Zur Laufzeit wird eine Tilemap nur gezeichnet. Kein Behavior kann sie lesen oder ändern.
Befund
src/runtimeund in den Graph-Nodes (src/core/graph/nodes/) gibt es keinen Bezug zur Tilemap.Zu bauen
Tile at(Tilemap, Layer, Zelle → Tile-Id bzw. leer)Set tile(Tilemap, Layer, Zelle, Tile, leer = löschen)World → cellundCell → world, damit man von einer Figurposition auf die Zelle kommtSet tilewird die Karte neu gezeichnet, Autotile-Kanten der Nachbarn inklusive.Offen (mit Vorschlag)
Set tilealle Platzierungen oder nur die eine? Vorschlag: nur die eine, die Laufzeit hält dafür eine eigene Kopie der Zellen.Set tileauch die Kollisionsformen neu.held-back, bis es eingeplant wird.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– lieferttileundemptyeiner Zelle. EinSet tileweiter vorne im selben Ablauf ist schon sichtbar.Set tile– setzt ein Tile, ohne Tile wird die Zelle geleert.donemeldet, ob es geklappt hat.World to cell/Cell to world– auch bei verschobener, gedrehter, skalierter oder gespiegelter Karte.insidesagt, ob die Zelle im Raster liegt.Tile– konstantes Tile, damit ein Graph ein gelesenes Tile vergleichen kann („steht hier eine Tür?“).Laufzeit
Moveim selben Frame trifft die neue Zelle schon, Rapier baut die Formen im nächsten Step neu.tilemap-Eingang = keine Karte (wie beiGet 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.d444b27ist noch nicht abgewartet.