#pragma once #include #include #include #include #include "core/rendering/sprite/moving_sprite.hpp" #include "core/resources/resource_types.hpp" class AnimatedSprite : public MovingSprite { public: // Dades d'una animació concreta dins d'un spritesheet. Les claus del // mapa (`animations_`) són els noms; aquí només es guarden els fotogrames // i l'estat de reproducció. struct AnimationData { std::vector frames; // Durada de cada frame en segons (convertit des de `frame_ms` al YAML). // Si té un sol valor, val per a tots els frames; altrament ha de tenir // la mateixa mida que `frames`. std::vector speeds; // -1 = no loop (es queda al darrer frame i marca `completed`). // 0 = loop complet des del primer frame. // N>0 = rebota al frame N en passar del final. int loop_from{0}; bool completed{false}; int current_frame{0}; float accumulated_time{0.0F}; }; explicit AnimatedSprite(const AnimationResource& cached_data); ~AnimatedSprite() override = default; void update(float delta_time) override; auto animationIsCompleted() -> bool; void setCurrentAnimation(const std::string& name); void resetAnimation(); void animate(float delta_time); private: std::unordered_map animations_; // Nom de l'animació activa. Buit fins que algú crida `setCurrentAnimation`. std::string current_animation_; };