đŸŽ„ Kamera-BĂŒhne — Handoff fĂŒr die Katzen

Von der Snake-BĂŒhne zum Side-Scroller. Prototyp: hoerraum/stage_snake_prototype.html.
Vorgeschichte: HANDOFF_STAGE_BAUSTEINE.md (Bausteine-Sichtung), Snake-Prototyp davor.

Die eine Idee

Zoom, Parallax und (spĂ€ter) Gaming sind KEINE drei Baustellen — es ist ein Treiber: die #camera-Group.
Wer die Kamera versteht, versteht alle drei. Nichts davon ist ein Neuanfang.

Was jetzt drin ist (stage_snake_prototype.html)

  1. #camera-Group umschließt die ganze Szene. Darin drei Tiefen-Layer mit data-depth
    (0.15 Himmel · 0.55 Boden · 1 Figuren-Vordergrund).
  2. Zoom im Wechsel mit den Sprechern. Keyframe-Liste CAM = [storySekunde, zoom, cx, cy],
    cx/cy = der Frame-Punkt, der zentriert wird. Weit beim ErzĂ€hler → rein auf Snakepy beim Reveal
    (2×) → wieder raus beim DavonschlĂ€ngeln. Interpoliert mit easeInOutQuad, getrieben von applyCamera(t).
  3. Parallax aus demselben Schwenk. Jeder Layer bekommt translateX = pan · (depth−1) · 0.4
    (pan = cx−500): ferne Layer schleppen hinterher → Tiefe. Keine zweite Mechanik, nur ein Faktor.
  4. prefers-reduced-motion: Kamera bleibt weit + statisch (REDUCE in applyCamera).

Die Formel (fĂŒrs Weiterbauen)

applyScene(t) = tl.seek(t)      // Figuren-Timeline (anime.js)
              + baseTransform(t) // S-Wackeln der Schlange
              + applyCamera(t)   // Zoom + Parallax

Kamera zentriert Punkt (cx,cy) bei Zoom s:
translate(500 − cx·s, 280 − cy·s) scale(s) auf #camera (1000×560-viewBox, Mitte 500/280).

Fallstricke (schon eingetreten, nicht nochmal reinlaufen)

  • anime.js ĂŒberschreibt style.transform komplett. Figuren brauchen zwei Ebenen: feste Platzierung
    (translate/scale) im SVG-Attribut außen, anime-Ebene innen (mount()). Sonst springt alles in den Ursprung.
  • scale auf SVG-<circle> (Augen) wirft sie vom SVG-Ursprung weg. Nur OpazitĂ€t animieren.
  • Kamera per Attribut, Layer-Parallax per style.transform — nicht mischen, sonst clobbert sich's.

NĂ€chste Stufen (erst bauen, wenn eine Episode es braucht — nicht spekulativ)

  • In den echten Player falten: #camera um #groundScene in season_player.template.html ziehen,
    CAM-Keyframes aus den Caption-Zeiten ableiten. applyCamera(t) hÀngt dann an audio.currentTime
    statt an der Prototyp-Uhr — sonst identisch.
  • Parallax ĂŒbers Scrollen (ganze Geschichte visualisieren): cx nicht aus Keyframes, sondern aus
    Scroll-Fortschritt speisen. Gleiche applyCamera.
  • Gaming (zwischen Zelda & Mario): Kamera folgt einer Figur statt der Timeline. Treiber Uhr → Eingabe.
    Alles andere bleibt.

Lore bleibt

Sternbild-Folgen (offen/5, kein Hexagon) behalten FĂ€den+Punkte. Bunt + Kamera sind pro Episode,
nicht global. đŸ„· Das Keks-Handbuch-Easter-Egg bleibt versteckt.

Klang → Bits → BĂŒhne → Wald. onezeromore <3