Load scene node #39

Closed
opened 2026-09-12 15:03:58 +02:00 by meleki · 1 comment
Owner

Mehrere Szenen in einem Lauf: ein Load scene-Node.

Stand: ein Lauf kennt genau eine Szene, Bildschirme sind heute Container, die man ein- und ausschaltet (Jump-Run: Title/Level/Win/Lose).

Abzuklären:

  • was beim Wechsel erhalten bleibt (globale Variablen? ein "persistentes" Objekt?)
  • Startszene des Projekts festlegen

Übernommen aus todo-notes/load-scene-node.md beim Umzug auf das Issue-System (2026-09-12).

  • Angelegt: 2026-09-11 · bf41919 — Add todo notes for the next round of features, gaps and upkeep
  • Gemeldet von: Claude (Assistent)
Mehrere Szenen in einem Lauf: ein `Load scene`-Node. Stand: ein Lauf kennt genau eine Szene, Bildschirme sind heute Container, die man ein- und ausschaltet (Jump-Run: Title/Level/Win/Lose). Abzuklären: - was beim Wechsel erhalten bleibt (globale Variablen? ein "persistentes" Objekt?) - Startszene des Projekts festlegen --- *Übernommen aus `todo-notes/load-scene-node.md` beim Umzug auf das Issue-System (2026-09-12).* - **Angelegt:** 2026-09-11 · `bf41919` — Add todo notes for the next round of features, gaps and upkeep - **Gemeldet von:** Claude (Assistent)
meleki added the todo-note label 2026-09-12 15:03:58 +02:00
admin added this to the Development project 2026-09-13 13:30:08 +02:00
admin moved this to Next in Development on 2026-09-15 09:15:13 +02:00
admin moved this to Queue in Development on 2026-09-15 09:19:27 +02:00
admin moved this to Next in Development on 2026-09-15 11:53:17 +02:00
Author
Owner

Umgesetzt in 1e9d21c, Wiki in e684997 (neue Seite Scenes).

Was entschieden wurde

Der Wechsel selbst. Load scene setzt ein Flag auf der World, genau wie Stop und Restart es schon taten; getauscht wird nach dem Tick, und bei mehreren Load scene im selben Tick gewinnt der letzte. Auf die laufende Szene angewandt baut der Node sie neu auf — das ist "Level zurücksetzen", ohne den Punktestand zu verlieren.

Was hinübergeht: genau ein Objekt, der SharedState. Also globale Variablen und globale Maschinen-Zustände; deren entered-Event feuert beim Wechsel nicht noch einmal. Alles Lokale (Instanzen, lokale Maschinen-Zustände) wird neu gebaut. Persistente Objekte gibt es bewusst nicht — Identität, Duplikate und Elternschaft sind eigene Fragen und gehören in ein eigenes Issue.

Wo ein Lauf beginnt. Neues Projektfeld startSceneId, gesetzt per Rechtsklick im Assets-Panel (Set as start scene / Clear start scene), markiert mit ▶ neben dem ● der aktiven Szene. Daneben sitzt am Play-Knopf ein Umschalter Start scene / Active scene, der sagt, welche der beiden Fragen Play stellt — gemerkt in localStorage, nicht im Projekt, weil das eine Arbeitsweise ist und kein Spielinhalt. Ohne benannte Startszene fallen beide Antworten zusammen, deshalb war kein PROJECT_FORMAT_VERSION-Bump nötig: ein altes Dokument bedeutet ohnehin genau das.

Sounds enden nicht, weil eine Szene endet. Die Regel ist allgemeiner geworden: eine Stimme gehört dem Behavior, das sie gestartet hat (AudioSink.play(file, volume, loop, owner)), und endet direkt nach On destroy — damit der Graph sein letztes Wort behält. Der Szenenwechsel ist damit gar kein Sonderfall mehr, er zerstört einfach alle Behaviors der alten Szene. Für den Gegner, der seine Explosion spielt und sich in derselben Ausführung selbst zerstört, hat Play sound jetzt einen detached-Eingang. Die Uhr läuft über den Wechsel weiter, nur ein Restart setzt sie zurück.

Ein Detail, das daraus folgt: ein leerer Besitzer ist niemand, nicht eine Gruppe — stopOwner('') macht nichts, sonst träfe es alle detached Stimmen auf einmal. Und Abbrüche zählen statt zu flaggen (pro Datei, pro Besitzer, global), sonst verschluckt ein alter Stopp den ersten Play, dessen Bytes noch unterwegs sind.

Nachgebessert auf Zuruf: der Szenen-Wähler in der Leiste bleibt im Play-Modus benutzbar — der Doppelklick im Assets-Panel tat ohnehin dasselbe ungeprüft, es waren zwei Wege zur selben Handlung und nur einer gesperrt. Er verschiebt, worauf der Editor schaut, nicht was der Lauf spielt. Der Umschalter beschriftet sich außerdem mit der Auswahl (Start scene / Active scene) statt mit dem Szenennamen.

Nebenbei: scene ist eine eigene Property-Kind geworden (wie sound), damit Picker, Listen-Item und ein Scene-Literal-Node abfallen und der Port verdrahtbar bleibt. Der Editor-Run ignoriert Load scene mit Konsolenhinweis — Szenen wechselt nur ein echter Lauf.

Belegt

npm run check                      → 86 Files, 1085 Tests, grün (vorher 1071)
npm run build                      → ok
GM_STEPS=34,35 node tools/e2e.mjs  → ALL PASSED – 32 checks
GM_STEPS=35 node tools/e2e.mjs     → ALL PASSED – 14 checks (nach dem Toolbar-Umbau)

Neu: tests/core/load-scene.test.ts, Schritt 35 load-scene, dazu zwei Checks in Schritt 34 (Zerstören beendet die Stimme / detached spielt weiter) und ein Check, der den Szenen-Wähler während des Laufs anklickt und nachweist, dass der Lauf weiterläuft. Der Hook __gm.sceneSelect() liefert Position und enabled — die Bedienbarkeit eines Knopfs sieht kein Farbvergleich.

Offen: die Gesamt-Check-Zahl im Wiki steht noch auf 910; der volle Lauf dreht gerade, CI-Task 51 auf 1e9d21c ebenfalls. Ich ziehe die Zahl nach, sobald sie belegt ist, statt sie zu schätzen.

Umgesetzt in `1e9d21c`, Wiki in `e684997` (neue Seite **Scenes**). ## Was entschieden wurde **Der Wechsel selbst.** `Load scene` setzt ein Flag auf der `World`, genau wie `Stop` und `Restart` es schon taten; getauscht wird **nach** dem Tick, und bei mehreren `Load scene` im selben Tick gewinnt der letzte. Auf die laufende Szene angewandt baut der Node sie neu auf — das ist "Level zurücksetzen", ohne den Punktestand zu verlieren. **Was hinübergeht:** genau ein Objekt, der `SharedState`. Also globale Variablen und globale Maschinen-Zustände; deren `entered`-Event feuert beim Wechsel nicht noch einmal. Alles Lokale (Instanzen, lokale Maschinen-Zustände) wird neu gebaut. Persistente Objekte gibt es bewusst **nicht** — Identität, Duplikate und Elternschaft sind eigene Fragen und gehören in ein eigenes Issue. **Wo ein Lauf beginnt.** Neues Projektfeld `startSceneId`, gesetzt per Rechtsklick im Assets-Panel (*Set as start scene* / *Clear start scene*), markiert mit `▶` neben dem `●` der aktiven Szene. Daneben sitzt am Play-Knopf ein Umschalter **Start scene / Active scene**, der sagt, welche der beiden Fragen Play stellt — gemerkt in `localStorage`, nicht im Projekt, weil das eine Arbeitsweise ist und kein Spielinhalt. Ohne benannte Startszene fallen beide Antworten zusammen, deshalb war kein `PROJECT_FORMAT_VERSION`-Bump nötig: ein altes Dokument bedeutet ohnehin genau das. **Sounds enden nicht, weil eine Szene endet.** Die Regel ist allgemeiner geworden: eine Stimme gehört dem Behavior, das sie gestartet hat (`AudioSink.play(file, volume, loop, owner)`), und endet direkt nach `On destroy` — damit der Graph sein letztes Wort behält. Der Szenenwechsel ist damit gar kein Sonderfall mehr, er zerstört einfach alle Behaviors der alten Szene. Für den Gegner, der seine Explosion spielt und sich in derselben Ausführung selbst zerstört, hat `Play sound` jetzt einen `detached`-Eingang. Die Uhr läuft über den Wechsel weiter, nur ein Restart setzt sie zurück. Ein Detail, das daraus folgt: ein leerer Besitzer ist *niemand*, nicht eine Gruppe — `stopOwner('')` macht nichts, sonst träfe es alle detached Stimmen auf einmal. Und Abbrüche zählen statt zu flaggen (pro Datei, pro Besitzer, global), sonst verschluckt ein alter Stopp den ersten Play, dessen Bytes noch unterwegs sind. **Nachgebessert auf Zuruf:** der Szenen-Wähler in der Leiste bleibt im Play-Modus benutzbar — der Doppelklick im Assets-Panel tat ohnehin dasselbe ungeprüft, es waren zwei Wege zur selben Handlung und nur einer gesperrt. Er verschiebt, worauf der Editor schaut, nicht was der Lauf spielt. Der Umschalter beschriftet sich außerdem mit der Auswahl (`Start scene` / `Active scene`) statt mit dem Szenennamen. **Nebenbei:** `scene` ist eine eigene Property-Kind geworden (wie `sound`), damit Picker, Listen-Item und ein `Scene`-Literal-Node abfallen und der Port verdrahtbar bleibt. Der Editor-Run ignoriert `Load scene` mit Konsolenhinweis — Szenen wechselt nur ein echter Lauf. ## Belegt ``` npm run check → 86 Files, 1085 Tests, grün (vorher 1071) npm run build → ok GM_STEPS=34,35 node tools/e2e.mjs → ALL PASSED – 32 checks GM_STEPS=35 node tools/e2e.mjs → ALL PASSED – 14 checks (nach dem Toolbar-Umbau) ``` Neu: `tests/core/load-scene.test.ts`, Schritt **35 `load-scene`**, dazu zwei Checks in Schritt 34 (Zerstören beendet die Stimme / `detached` spielt weiter) und ein Check, der den Szenen-Wähler **während des Laufs** anklickt und nachweist, dass der Lauf weiterläuft. Der Hook `__gm.sceneSelect()` liefert Position und `enabled` — die Bedienbarkeit eines Knopfs sieht kein Farbvergleich. **Offen:** die Gesamt-Check-Zahl im Wiki steht noch auf 910; der volle Lauf dreht gerade, CI-Task 51 auf `1e9d21c` ebenfalls. Ich ziehe die Zahl nach, sobald sie belegt ist, statt sie zu schätzen.
admin moved this to Done in Development on 2026-09-15 13:33:54 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#39