Sequenzierte Animation #32

Open
opened 2026-04-17 04:34:37 +00:00 by sebastian · 0 comments
Owner

Problem: Für komplexere Effekte (z.B. "leuchte auf, dann fade aus, dann entferne Entity") müssen Animationen nacheinander abgespielt werden. Das ist mit dem bisherigen System nur durch verschachtelte onComplete-Callbacks möglich – schwer lesbar und schwer wartbar.
Lösung:

// engine/core/animations/AnimationSequence.h
class AnimationSequence {
public:
    AnimationSequence& then(AnimationTrack track);  // fügt nächsten Schritt hinzu
    AnimationSequence& wait(float seconds);          // Pause ohne Target
    AnimationSequence& finally(std::function<void()> callback);

    void update(float deltaTime);
    bool isFinished() const;

private:
    std::queue<AnimationTrack> steps;
    AnimationTrack* current = nullptr;
};

Beispiel:

AnimationSequence seq;
seq.then(scaleUpTrack)         // 0.3s: scale 0→1
   .wait(0.1f)                 // kurze Pause
   .then(glowFadeTrack)        // 0.5s: glow fade out
   .finally([&]{ em.destroyEntity(e); });

AnimationComponent hält dann optional eine Sequence:

class AnimationComponent : public Component {
public:
    std::vector<AnimationTrack>      tracks;     // parallele Tracks (wie bisher)
    std::vector<AnimationSequence>   sequences;  // NEU: sequenzielle Ketten
};

Acceptance Criteria:

  • AnimationSequence spielt Tracks strikt nacheinander ab
  • wait() wartet ohne Target-Aufruf
  • finally() wird genau einmal nach dem letzten Track aufgerufen
  • Abgeschlossene Sequences werden wie One-Shot-Tracks automatisch entfernt
  • Unit Tests: 3-stufige Sequence endet in korrekter Reihenfolge mit korrektem Timing
Problem: Für komplexere Effekte (z.B. "leuchte auf, dann fade aus, dann entferne Entity") müssen Animationen nacheinander abgespielt werden. Das ist mit dem bisherigen System nur durch verschachtelte onComplete-Callbacks möglich – schwer lesbar und schwer wartbar. Lösung: ``` // engine/core/animations/AnimationSequence.h class AnimationSequence { public: AnimationSequence& then(AnimationTrack track); // fügt nächsten Schritt hinzu AnimationSequence& wait(float seconds); // Pause ohne Target AnimationSequence& finally(std::function<void()> callback); void update(float deltaTime); bool isFinished() const; private: std::queue<AnimationTrack> steps; AnimationTrack* current = nullptr; }; ``` Beispiel: ``` AnimationSequence seq; seq.then(scaleUpTrack) // 0.3s: scale 0→1 .wait(0.1f) // kurze Pause .then(glowFadeTrack) // 0.5s: glow fade out .finally([&]{ em.destroyEntity(e); }); ``` AnimationComponent hält dann optional eine Sequence: ``` class AnimationComponent : public Component { public: std::vector<AnimationTrack> tracks; // parallele Tracks (wie bisher) std::vector<AnimationSequence> sequences; // NEU: sequenzielle Ketten }; ``` Acceptance Criteria: - AnimationSequence spielt Tracks strikt nacheinander ab - wait() wartet ohne Target-Aufruf - finally() wird genau einmal nach dem letzten Track aufgerufen - Abgeschlossene Sequences werden wie One-Shot-Tracks automatisch entfernt - Unit Tests: 3-stufige Sequence endet in korrekter Reihenfolge mit korrektem Timing
sebastian added this to the Animationsystem milestone 2026-04-17 04:34:37 +00:00
sebastian added the
enhancement
engine
labels 2026-04-17 04:34:37 +00:00
sebastian added this to the Dicewars project 2026-04-17 04:34:37 +00:00
sebastian added a new dependency 2026-04-17 04:34:43 +00:00
sebastian added a new dependency 2026-04-17 04:34:54 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Depends on
Reference: sebastian/Dicewars-Siedler#32
No description provided.