Globale Zeit statt lokaler Zeit #30

Open
opened 2026-04-17 04:27:39 +00:00 by sebastian · 0 comments
Owner

AnimationSystem::update(em, time) übergibt die globale Laufzeit. Das bedeutet: Jede neu erstellte Entity startet ihre Sine-Animation mitten in einem Zyklus – bei welchem Phase-Offset hängt davon ab wann die Entity erstellt wurde.
Für den Preview-Pulse ist das OK (Phase egal). Für eine "scale in from 0"-Animation wäre das ein Bug.
Lösung: pro Track eine localTime akkumulieren, statt globale Zeit zu übergeben:

void update(float deltaTime) {
    localTime += deltaTime;
    target(curve.evaluate(localTime));
}

Das AnimationSystem übergibt dann deltaTime statt time.

// AnimationTrack.h
struct AnimationTrack {
    AnimationCurve curve;
    AnimationTarget target;
    bool  enabled   = true;
    float localTime = 0.f;   // NEU

    void update(float deltaTime) {  // war: update(float time)
        if (!enabled) return;
        localTime += deltaTime;
        target(curve.evaluate(localTime));
    }

    void reset() { localTime = 0.f; }
};

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

Acceptance Criteria:

  • AnimationSystem::update() bekommt deltaTime statt time
  • Alle Aufrufstellen (GameLayer.cpp) angepasst
  • Neu erstellte Entities starten ihre Animation immer bei localTime = 0
  • Bestehende Animationen (Preview-Pulse, WorldSprite-Float) verhalten sich visuell identisch
AnimationSystem::update(em, time) übergibt die globale Laufzeit. Das bedeutet: Jede neu erstellte Entity startet ihre Sine-Animation mitten in einem Zyklus – bei welchem Phase-Offset hängt davon ab wann die Entity erstellt wurde. Für den Preview-Pulse ist das OK (Phase egal). Für eine "scale in from 0"-Animation wäre das ein Bug. Lösung: pro Track eine localTime akkumulieren, statt globale Zeit zu übergeben: ``` void update(float deltaTime) { localTime += deltaTime; target(curve.evaluate(localTime)); } ``` Das AnimationSystem übergibt dann deltaTime statt time. ``` // AnimationTrack.h struct AnimationTrack { AnimationCurve curve; AnimationTarget target; bool enabled = true; float localTime = 0.f; // NEU void update(float deltaTime) { // war: update(float time) if (!enabled) return; localTime += deltaTime; target(curve.evaluate(localTime)); } void reset() { localTime = 0.f; } }; // AnimationSystem.cpp void AnimationSystem::update(EntityManager& em, float deltaTime) { // war: float time for (EntityID e : em.getAllEntities()) { auto anim = em.getComponent<AnimationComponent>(e); if (!anim) continue; for (auto& track : anim->tracks) { track.update(deltaTime); } } } ``` Acceptance Criteria: - AnimationSystem::update() bekommt deltaTime statt time - Alle Aufrufstellen (GameLayer.cpp) angepasst - Neu erstellte Entities starten ihre Animation immer bei localTime = 0 - Bestehende Animationen (Preview-Pulse, WorldSprite-Float) verhalten sich visuell identisch
sebastian added this to the Animationsystem milestone 2026-04-17 04:27:39 +00:00
sebastian added the
enhancement
engine
labels 2026-04-17 04:27:39 +00:00
sebastian added this to the Dicewars project 2026-04-17 04:27:39 +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.

Blocks
#32 Sequenzierte Animation
sebastian/Dicewars-Siedler
Reference: sebastian/Dicewars-Siedler#30
No description provided.