Animation: Überblenden beim Wechsel (Crossfade) #106

Closed
opened 2026-09-16 21:23:31 +02:00 by meleki · 2 comments
Owner

Aus #97: wechselt ein Objekt von walk auf idle, springt der Wert hart (Entscheidung 17: die zuletzt gestartete gewinnt). Für Bildfolgen ist das richtig, für Zahlen (Rotation eines Arms, Scale, Alpha) sieht es nach Ruck aus.

Idee: Play animation bekommt einen optionalen Port Blend (frames). Während dieser Zeit wird für überblendbare Arten (Zahl, Farbe) linear zwischen dem Wert der bisherigen Gewinnerin und der neuen gemischt; nicht überblendbare Arten (Texture, Boolean, Text, Choice) springen sofort auf die neue.

Offen:

  • Gilt der Blend pro Property (nur dort, wo beide Animationen eine Zeile haben) oder auch gegen den Vorlagenwert, wenn die alte Animation die Property nicht kennt?
  • Was passiert, wenn während des Blends ein drittes Play kommt?

Nicht anfangen, bevor Easing (#101) steht, weil beide dieselbe Stelle trackWriteAt anfassen.

Aus #97: wechselt ein Objekt von `walk` auf `idle`, springt der Wert hart (Entscheidung 17: die zuletzt gestartete gewinnt). Für Bildfolgen ist das richtig, für Zahlen (Rotation eines Arms, Scale, Alpha) sieht es nach Ruck aus. **Idee:** `Play animation` bekommt einen optionalen Port `Blend (frames)`. Während dieser Zeit wird für überblendbare Arten (Zahl, Farbe) linear zwischen dem Wert der bisherigen Gewinnerin und der neuen gemischt; nicht überblendbare Arten (Texture, Boolean, Text, Choice) springen sofort auf die neue. **Offen:** - Gilt der Blend pro Property (nur dort, wo beide Animationen eine Zeile haben) oder auch gegen den Vorlagenwert, wenn die alte Animation die Property nicht kennt? - Was passiert, wenn während des Blends ein drittes `Play` kommt? Nicht anfangen, bevor Easing (#101) steht, weil beide dieselbe Stelle `trackWriteAt` anfassen.
admin added this to the Development project 2026-09-16 21:24:29 +02:00
admin moved this to Next in Development on 2026-09-17 06:47:09 +02:00
Author
Owner

Umgesetzt in 04dc254, Wiki 8c3dd6c (Animations.md, Absatz Blend).

Was es macht

  • Play animation hat einen neuen Port blend (frames), Standard 0 (= sofortiger Wechsel wie bisher).
  • Bei > 0 blendet die neue Animation über so viele ihrer eigenen Frames ein. Zahlen und Farben werden linear gemischt; Texture, Boolean, Text und Choice springen sofort.
  • Offene Fragen, entschieden: gemischt wird gegen das, was die Property gerade hält.
    • Schreibt eine früher gestartete Animation im selben Frame dorthin, wird ihr Wert live mitgemischt (der alte Walk läuft unter dem Blend weiter).
    • Sonst zählt der Wert beim Blend-Start (Vorlagenwert oder was eine gestoppte Animation stehen ließ).
    • Ein drittes Play während eines Blends blendet vom schon gemischten Wert aus, ohne Sprung.
  • Ein Blend startet nur, wenn die Animation wirklich übernimmt: ein Graph, der die führende Animation jeden Frame erneut spielt, startet ihn nicht neu. Wird eine laufende Animation wieder Gewinnerin, blendet sie erneut.
  • Grenze: Ist eine Once-Animation kürzer als ihr Blend, endet sie auf dem Mischwert.

Tests (lokal)

npm run check                        → 92 Files, 1209 Tests (vorher 1202), exit 0
npm run build                        → ok
smoke-actor (frisch geseedet)        → ALL PASSED – 21 checks
GM_STEPS=24,25,26 (frisch geseedet)  → ALL PASSED – 101 checks

7 neue Unit-Tests; Gegenprobe mit drei eingebauten Fehlern (Live-Mischung aus, Blend bei jedem Play neu, Art-Prüfung aus) – jeder fällt auf. Keine neuen e2e-Checks, Summe bleibt 943. CI auf 04dc254 wurde vor dem Schließen nicht abgewartet.

Umgesetzt in `04dc254`, Wiki `8c3dd6c` (`Animations.md`, Absatz *Blend*). **Was es macht** - `Play animation` hat einen neuen Port `blend (frames)`, Standard 0 (= sofortiger Wechsel wie bisher). - Bei > 0 blendet die neue Animation über so viele ihrer eigenen Frames ein. Zahlen und Farben werden linear gemischt; Texture, Boolean, Text und Choice springen sofort. - **Offene Fragen, entschieden:** gemischt wird gegen das, was die Property gerade hält. - Schreibt eine früher gestartete Animation im selben Frame dorthin, wird ihr Wert live mitgemischt (der alte Walk läuft unter dem Blend weiter). - Sonst zählt der Wert beim Blend-Start (Vorlagenwert oder was eine gestoppte Animation stehen ließ). - Ein drittes `Play` während eines Blends blendet vom schon gemischten Wert aus, ohne Sprung. - Ein Blend startet nur, wenn die Animation wirklich übernimmt: ein Graph, der die führende Animation jeden Frame erneut spielt, startet ihn nicht neu. Wird eine laufende Animation wieder Gewinnerin, blendet sie erneut. - Grenze: Ist eine `Once`-Animation kürzer als ihr Blend, endet sie auf dem Mischwert. **Tests (lokal)** ``` npm run check → 92 Files, 1209 Tests (vorher 1202), exit 0 npm run build → ok smoke-actor (frisch geseedet) → ALL PASSED – 21 checks GM_STEPS=24,25,26 (frisch geseedet) → ALL PASSED – 101 checks ``` 7 neue Unit-Tests; Gegenprobe mit drei eingebauten Fehlern (Live-Mischung aus, Blend bei jedem Play neu, Art-Prüfung aus) – jeder fällt auf. Keine neuen e2e-Checks, Summe bleibt 943. CI auf `04dc254` wurde vor dem Schließen nicht abgewartet.
Author
Owner

Nachtrag: Sekunden, Ausblenden, restart

Drei Nachbesserungen nach dem Test im Editor, alle an diesem Issue statt eines neuen.

1. Blend in Sekunden (8a377d9)

blend (frames) heißt jetzt blend (s). Frames zählten die fps der neuen Animation — derselbe Wert war je nach Animation unterschiedlich lang und änderte sich still mit fps. Sekunden passen zu On timer und zu Spine/Godot/Unity.
⚠️ Gespeicherte Graphen mit blend: 1 bedeuten jetzt 1 Sekunde (betrifft „Demo project 3", nicht im Git).

2. Ausblenden (195fc94)

Anlass: Once-Animation mit Blend über einer laufenden Ping-pong-Animation — am Ende sprang x zurück.

  • Stop animation → blend (s): blendet in dieser Zeit zurück zu dem, was darunter liegt (Wert einer früher gestarteten Animation auf derselben Property, sonst der Wert vom Start). Bei 0 wie bisher: Werte bleiben stehen. Texture/Boolean/Text/Choice springen. Auch pausierte Animationen blenden aus.
  • Play animation → blend out (s): nur für Once (reset) — blendet am Ende zum Startwert zurück statt zu springen. On animation finished feuert am Ende der Frames, nicht nach dem Ausblenden.
  • Play während des Ausblendens: dreht ohne Sprung um (bei blend (s) > 0). Ein schon beendeter Once (reset)-Durchlauf startet neu und blendet vom erreichten Wert ein.
  • Bekannte Unstimmigkeit, bewusst gelassen: Stop mit 0 lässt Werte stehen, Stop mit 0,01 geht zum Startwert.

3. restart (195fc94)

Boolean-Port an Play animation, Standard aus. An: eine laufende, pausierte oder ausblendende Animation beginnt wieder bei Frame 0 und gewinnt; mit blend (s) > 0 vom aktuellen Wert aus. Startwerte vom ersten Start bleiben (relative Zeilen zählen nicht weiter). Falle: an On update kommt sie nie über Frame 0 hinaus — gedacht für einzelne Ereignisse.

Tests (lokal)

npm run check                        → 92 Files, 1222 Tests (vorher 1209), CHECK EXIT 0
npm run build                        → BUILD EXIT 0
smoke-actor (frisch geseedet)        → ALL PASSED – 21 checks
GM_STEPS=24,25,26 (frisch geseedet)  → ALL PASSED – 101 checks
  • 13 neue Unit-Tests (1 fps-Unabhängigkeit, 7 Ausblenden inkl. des Ping-pong-Szenarios, 5 restart).
  • Gegenprobe mit absichtlich eingebauten Fehlern (Blend wieder mit fps, Ausblenden ohne Wert darunter, Pause hält Fade an, Umdrehen ohne erreichten Stand, blend out ignoriert, restart ignoriert) — jeder fällt auf, Originale zurückgespielt.
  • Keine neuen e2e-Checks, Summe bleibt 943. CI auf 195fc94 nicht abgewartet.

Wiki: Animations.md — Absätze Blend (Sekunden), Blending out, Restart (ae96e4d, 94e4652).

## Nachtrag: Sekunden, Ausblenden, `restart` Drei Nachbesserungen nach dem Test im Editor, alle an diesem Issue statt eines neuen. ### 1. Blend in Sekunden (`8a377d9`) `blend (frames)` heißt jetzt **`blend (s)`**. Frames zählten die fps der *neuen* Animation — derselbe Wert war je nach Animation unterschiedlich lang und änderte sich still mit `fps`. Sekunden passen zu `On timer` und zu Spine/Godot/Unity. ⚠️ Gespeicherte Graphen mit `blend: 1` bedeuten jetzt 1 Sekunde (betrifft „Demo project 3", nicht im Git). ### 2. Ausblenden (`195fc94`) Anlass: `Once`-Animation mit Blend über einer laufenden Ping-pong-Animation — am Ende sprang `x` zurück. - **`Stop animation` → `blend (s)`:** blendet in dieser Zeit zurück zu dem, was darunter liegt (Wert einer früher gestarteten Animation auf derselben Property, sonst der Wert vom Start). Bei 0 wie bisher: Werte bleiben stehen. Texture/Boolean/Text/Choice springen. Auch pausierte Animationen blenden aus. - **`Play animation` → `blend out (s)`:** nur für `Once (reset)` — blendet am Ende zum Startwert zurück statt zu springen. `On animation finished` feuert am Ende der Frames, nicht nach dem Ausblenden. - **Play während des Ausblendens:** dreht ohne Sprung um (bei `blend (s)` > 0). Ein schon beendeter `Once (reset)`-Durchlauf startet neu und blendet vom erreichten Wert ein. - Bekannte Unstimmigkeit, bewusst gelassen: `Stop` mit 0 lässt Werte stehen, `Stop` mit 0,01 geht zum Startwert. ### 3. `restart` (`195fc94`) Boolean-Port an `Play animation`, Standard aus. An: eine laufende, pausierte oder ausblendende Animation beginnt wieder bei Frame 0 und gewinnt; mit `blend (s)` > 0 vom aktuellen Wert aus. Startwerte vom ersten Start bleiben (relative Zeilen zählen nicht weiter). Falle: an `On update` kommt sie nie über Frame 0 hinaus — gedacht für einzelne Ereignisse. ### Tests (lokal) ``` npm run check → 92 Files, 1222 Tests (vorher 1209), CHECK EXIT 0 npm run build → BUILD EXIT 0 smoke-actor (frisch geseedet) → ALL PASSED – 21 checks GM_STEPS=24,25,26 (frisch geseedet) → ALL PASSED – 101 checks ``` - 13 neue Unit-Tests (1 fps-Unabhängigkeit, 7 Ausblenden inkl. des Ping-pong-Szenarios, 5 `restart`). - Gegenprobe mit absichtlich eingebauten Fehlern (Blend wieder mit fps, Ausblenden ohne Wert darunter, Pause hält Fade an, Umdrehen ohne erreichten Stand, `blend out` ignoriert, `restart` ignoriert) — jeder fällt auf, Originale zurückgespielt. - Keine neuen e2e-Checks, Summe bleibt 943. CI auf `195fc94` nicht abgewartet. Wiki: `Animations.md` — Absätze *Blend* (Sekunden), *Blending out*, *Restart* (`ae96e4d`, `94e4652`).
admin moved this to Done in Development on 2026-09-17 11:53:47 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#106