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)
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.
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.
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:
Übernommen aus
todo-notes/load-scene-node.mdbeim Umzug auf das Issue-System (2026-09-12).bf41919— Add todo notes for the next round of features, gaps and upkeepUmgesetzt in
1e9d21c, Wiki ine684997(neue Seite Scenes).Was entschieden wurde
Der Wechsel selbst.
Load scenesetzt ein Flag auf derWorld, genau wieStopundRestartes schon taten; getauscht wird nach dem Tick, und bei mehrerenLoad sceneim 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; derenentered-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 inlocalStorage, nicht im Projekt, weil das eine Arbeitsweise ist und kein Spielinhalt. Ohne benannte Startszene fallen beide Antworten zusammen, deshalb war keinPROJECT_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 nachOn 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, hatPlay soundjetzt einendetached-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:
sceneist eine eigene Property-Kind geworden (wiesound), damit Picker, Listen-Item und einScene-Literal-Node abfallen und der Port verdrahtbar bleibt. Der Editor-Run ignoriertLoad scenemit Konsolenhinweis — Szenen wechselt nur ein echter Lauf.Belegt
Neu:
tests/core/load-scene.test.ts, Schritt 35load-scene, dazu zwei Checks in Schritt 34 (Zerstören beendet die Stimme /detachedspielt 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 undenabled— 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
1e9d21cebenfalls. Ich ziehe die Zahl nach, sobald sie belegt ist, statt sie zu schätzen.