Keine endlichen Animationen #29

Open
opened 2026-04-17 04:26:57 +00:00 by sebastian · 0 comments
Owner

Problem: Alle Animationen laufen unendlich. Für Bau-Einblendungen, Upgrade-Effekte, Szenenübergänge und Ressourcen-Sammel-Animationen wird eine Möglichkeit gebraucht, Animationen für eine definierte Zeit abzuspielen und danach eine Aktion auszulösen.
Änderung:

struct AnimationTrack {
    AnimationCurve curve;
    AnimationTarget target;
    bool  enabled   = true;
    float localTime = 0.f;
    float duration  = -1.f;            // NEU: -1 = looping, > 0 = endlich
    std::function<void()> onComplete;  // NEU: optional

    bool isFinished() const {
        return duration > 0.f && localTime >= duration;
    }

    void update(float deltaTime) {
        if (!enabled || isFinished()) return;
        localTime += deltaTime;
        float t = (duration > 0.f)
            ? std::min(localTime, duration)  // klemmt am Ende
            : localTime;
        target(curve.evaluate(t));

        if (isFinished() && onComplete) onComplete();
    }
};

AnimationSystem entfernt abgeschlossene One-Shot-Tracks automatisch:

void AnimationSystem::update(EntityManager& em, float deltaTime) {
    for (EntityID e : em.getAllEntities()) {
        auto anim = em.getComponent<AnimationComponent>(e);
        if (!anim) continue;
        for (auto& track : anim->tracks) track.update(deltaTime);

        // abgeschlossene One-Shots entfernen
        std::erase_if(anim->tracks, [](const AnimationTrack& t) {
            return t.isFinished();
        });
    }
}

Beispiel-Verwendung (Bau-Animation):
AnimationTrack scaleIn;
scaleIn.curve = AnimationCurve{CurveType::EaseInOut, 1.f, 1.f};
scaleIn.duration = 0.4f;
scaleIn.target = [transform](float v) { transform->scale = glm::vec3(v); };
scaleIn.onComplete = e, &em { /* z.B. Preview-Entity entfernen */ };
anim->tracks.push_back(scaleIn);
Acceptance Criteria:

  • duration = -1 (Standard) verhält sich wie bisher – kein Breaking Change
  • Track mit duration > 0 stoppt nach Ablauf und ruft onComplete auf
  • Abgeschlossene Tracks werden automatisch aus AnimationComponent::tracks entfernt
  • Unit Tests: One-Shot endet nach korrekter Zeit, onComplete wird genau einmal aufgerufen
Problem: Alle Animationen laufen unendlich. Für Bau-Einblendungen, Upgrade-Effekte, Szenenübergänge und Ressourcen-Sammel-Animationen wird eine Möglichkeit gebraucht, Animationen für eine definierte Zeit abzuspielen und danach eine Aktion auszulösen. Änderung: ``` struct AnimationTrack { AnimationCurve curve; AnimationTarget target; bool enabled = true; float localTime = 0.f; float duration = -1.f; // NEU: -1 = looping, > 0 = endlich std::function<void()> onComplete; // NEU: optional bool isFinished() const { return duration > 0.f && localTime >= duration; } void update(float deltaTime) { if (!enabled || isFinished()) return; localTime += deltaTime; float t = (duration > 0.f) ? std::min(localTime, duration) // klemmt am Ende : localTime; target(curve.evaluate(t)); if (isFinished() && onComplete) onComplete(); } }; ``` AnimationSystem entfernt abgeschlossene One-Shot-Tracks automatisch: ``` void AnimationSystem::update(EntityManager& em, float deltaTime) { for (EntityID e : em.getAllEntities()) { auto anim = em.getComponent<AnimationComponent>(e); if (!anim) continue; for (auto& track : anim->tracks) track.update(deltaTime); // abgeschlossene One-Shots entfernen std::erase_if(anim->tracks, [](const AnimationTrack& t) { return t.isFinished(); }); } } ``` Beispiel-Verwendung (Bau-Animation): AnimationTrack scaleIn; scaleIn.curve = AnimationCurve{CurveType::EaseInOut, 1.f, 1.f}; scaleIn.duration = 0.4f; scaleIn.target = [transform](float v) { transform->scale = glm::vec3(v); }; scaleIn.onComplete = [e, &em]() { /* z.B. Preview-Entity entfernen */ }; anim->tracks.push_back(scaleIn); Acceptance Criteria: - duration = -1 (Standard) verhält sich wie bisher – kein Breaking Change - Track mit duration > 0 stoppt nach Ablauf und ruft onComplete auf - Abgeschlossene Tracks werden automatisch aus AnimationComponent::tracks entfernt - Unit Tests: One-Shot endet nach korrekter Zeit, onComplete wird genau einmal aufgerufen
sebastian added this to the Animationsystem milestone 2026-04-17 04:26:57 +00:00
sebastian added the
enhancement
engine
labels 2026-04-17 04:26:57 +00:00
sebastian added this to the Dicewars project 2026-04-17 04:26:57 +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.

Dependencies

No dependencies set.

Reference: sebastian/Dicewars-Siedler#29
No description provided.