Pause stoppt die Animationen nicht: Kreide-Wackeln, Schal und Partikel-Zeit laufen weiter #7

Open
opened 2026-08-29 01:41:07 +02:00 by G1LL1 · 2 comments
G1LL1 commented 2026-08-29 01:41:07 +02:00 (Migrated from gitlab.g1ll1.com)

Komponente: GAME (update)
Betroffene Version: main @ 238ed66, index.html Zeilen 2589–2604

Beschreibung

AGENTS.md verlangt für die Pause:

Während der Pause müssen Animation, Physik, Partikel und Audio angehalten werden.

Physik, Partikel und Simulationsschritte stehen korrekt still, die Animation nicht:
S.visualTime und S.tick werden vor der State-Prüfung hochgezählt und damit auch im
pauseierten Zustand weitergeführt. render() läuft ohnehin weiter und verwendet genau diese
Werte.

Gemessen (PAUSED, 500 ms Realzeit zugewartet):

{
  "t0": { "state": "PAUSED", "vt": 6.802, "tick": 68, "run": 2.820 },
  "t1": {                                "vt": 7.306, "tick": 73, "run": 2.820 },
  "visualTimeAdvancedWhilePaused": 0.505,
  "runTimeAdvancedWhilePaused": 0.000
}

Ursache

// index.html:2589-2604
function update(dt) {
  S.visualTime += dt;                 // <-- vor der State-Prüfung
  S.tick = Math.floor(S.visualTime * 10);
  INPUT.tickTimers(dt);
  ...
  if (S.state === "PAUSED" || S.state === "GAME_OVER") return;   // zu spät

Betroffene Zeichenorte, die visualTime/tick verwenden:

  • Linien-Unruhe / „Gekritzel“ (chalk(..., tick)) – Wackeln aller Linien, inkl. Boden und Figur
  • drawScarf (Schalwellen hinter der Figur)
  • Fragment-Rotation (drawFragment, spin = t * 1.9)
  • Parallax-Bewegung und Fokus-Effekt

Bei reducedMotion (S.settings.reduced) ist das Wackeln reduziert, Schal/Fragmente laufen
aber ebenfalls weiter.

Auswirkung

  • Sichtbar lebendes Standbild im Pause-Overlay – wirkt wie ein Flackern hinter dem Dialog.
  • Vorgabe aus AGENTS.md nicht erfüllt.
  • Bei prefers-reduced-motion: reduce unnötige Dauerbewegung hinter dem Pause-Dialog.

Lösungsvorschlag

Animationszeit nur in aktiven Zuständen fortschreiben und den Frühausstieg nach oben ziehen:

function update(dt) {
  if (S.state === "MENU" || S.state === "SETTINGS" || S.state === "HELP") { ...demo...; return; }
  if (S.state === "PAUSED" || S.state === "GAME_OVER") { renderStatisch(); return; }
  S.visualTime += dt;
  S.tick = Math.floor(S.visualTime * 10);
  ...
}

Alternativ visualTime an eine eigene, vom Simulations-State unabhängige Uhr binden und im
Pause-Zweig einfrieren. Dazu ein Test: nach pauseGame() darf sich S.visualTime über
mehrere Frames nicht ändern, und zwei aufeinanderfolgende Screenshots im Pausenmenü müssen
pixelidentisch sein.


Dokumentiert in gitlab-issues/07-pause-stoppt-animation-nicht.md (Commit 238ed66). Alle Befunde ausgeführt und gemessen; Repro-Schritte im Text.

**Komponente:** GAME (`update`) **Betroffene Version:** `main` @ `238ed66`, `index.html` Zeilen 2589–2604 ## Beschreibung AGENTS.md verlangt für die Pause: > Während der Pause müssen Animation, Physik, Partikel und Audio angehalten werden. Physik, Partikel und Simulationsschritte stehen korrekt still, die **Animation nicht**: `S.visualTime` und `S.tick` werden vor der State-Prüfung hochgezählt und damit auch im pauseierten Zustand weitergeführt. `render()` läuft ohnehin weiter und verwendet genau diese Werte. Gemessen (`PAUSED`, 500 ms Realzeit zugewartet): ```json { "t0": { "state": "PAUSED", "vt": 6.802, "tick": 68, "run": 2.820 }, "t1": { "vt": 7.306, "tick": 73, "run": 2.820 }, "visualTimeAdvancedWhilePaused": 0.505, "runTimeAdvancedWhilePaused": 0.000 } ``` ## Ursache ```js // index.html:2589-2604 function update(dt) { S.visualTime += dt; // <-- vor der State-Prüfung S.tick = Math.floor(S.visualTime * 10); INPUT.tickTimers(dt); ... if (S.state === "PAUSED" || S.state === "GAME_OVER") return; // zu spät ``` Betroffene Zeichenorte, die `visualTime`/`tick` verwenden: * Linien-Unruhe / „Gekritzel“ (`chalk(..., tick)`) – Wackeln aller Linien, inkl. Boden und Figur * `drawScarf` (Schalwellen hinter der Figur) * Fragment-Rotation (`drawFragment`, `spin = t * 1.9`) * Parallax-Bewegung und Fokus-Effekt Bei `reducedMotion` (`S.settings.reduced`) ist das Wackeln reduziert, Schal/Fragmente laufen aber ebenfalls weiter. ## Auswirkung * Sichtbar lebendes Standbild im Pause-Overlay – wirkt wie ein Flackern hinter dem Dialog. * Vorgabe aus AGENTS.md nicht erfüllt. * Bei `prefers-reduced-motion: reduce` unnötige Dauerbewegung hinter dem Pause-Dialog. ## Lösungsvorschlag Animationszeit nur in aktiven Zuständen fortschreiben und den Frühausstieg nach oben ziehen: ```js function update(dt) { if (S.state === "MENU" || S.state === "SETTINGS" || S.state === "HELP") { ...demo...; return; } if (S.state === "PAUSED" || S.state === "GAME_OVER") { renderStatisch(); return; } S.visualTime += dt; S.tick = Math.floor(S.visualTime * 10); ... } ``` Alternativ `visualTime` an eine eigene, vom Simulations-State unabhängige Uhr binden und im Pause-Zweig einfrieren. Dazu ein Test: nach `pauseGame()` darf sich `S.visualTime` über mehrere Frames nicht ändern, und zwei aufeinanderfolgende Screenshots im Pausenmenü müssen pixelidentisch sein. --- *Dokumentiert in `gitlab-issues/07-pause-stoppt-animation-nicht.md` (Commit `238ed66`). Alle Befunde ausgeführt und gemessen; Repro-Schritte im Text.*
G1LL1 commented 2026-08-29 01:45:26 +02:00 (Migrated from gitlab.g1ll1.com)

changed the description

changed the description
G1LL1 commented 2026-08-29 01:48:10 +02:00 (Migrated from gitlab.g1ll1.com)

changed the description

changed the description
Sign in to join this conversation.
No description provided.