#pragma once #include // for SDL_Rect #include // for Uint8 #include // for shared_ptr #include // for string #include // for vector #include "moving_sprite.h" // for MovingSprite class Texture; struct Animation { std::string name; // Nombre de la animacion std::vector frames; // Cada uno de los frames que componen la animación int speed; // Velocidad de la animación int loop; // Indica a que frame vuelve la animación al terminar. -1 para que no vuelva bool completed; // Indica si ha finalizado la animación int current_frame; // Frame actual int counter; // Contador para las animaciones }; struct AnimatedFile { std::vector animations; // Vector con las diferentes animaciones std::shared_ptr texture; // Textura con los graficos para el sprite }; // Carga la animación desde un fichero AnimatedFile loadAnimationFromFile(std::shared_ptr texture, std::string filePath); class AnimatedSprite : public MovingSprite { protected: // Variables std::vector animations_; // Vector con las diferentes animaciones int current_animation_; // Animacion activa public: // Constructor explicit AnimatedSprite(std::shared_ptr texture = nullptr, const std::string &file = std::string(), std::vector *buffer = nullptr); explicit AnimatedSprite(const AnimatedFile *animation); // Destructor virtual ~AnimatedSprite(); // Calcula el frame correspondiente a la animación actual void animate(); // Obtiene el número de frames de la animación actual int getNumFrames(); // Establece el frame actual de la animación void setCurrentFrame(int num); // Establece el valor del contador void setAnimationCounter(const std::string &name, int num); // Establece la velocidad de una animación void setAnimationSpeed(const std::string &name, int speed); void setAnimationSpeed(int index, int speed); // Establece el frame al que vuelve la animación al finalizar void setAnimationLoop(const std::string &name, int loop); void setAnimationLoop(int index, int loop); // Establece el valor de la variable void setAnimationCompleted(const std::string &name, bool value); void setAnimationCompleted(int index, bool value); // Comprueba si ha terminado la animación bool animationIsCompleted(); // Devuelve el rectangulo de una animación y frame concreto SDL_Rect getAnimationClip(const std::string &name = "default", Uint8 index = 0); SDL_Rect getAnimationClip(int indexA = 0, Uint8 indexF = 0); // Obtiene el indice de la animación a partir del nombre int getIndex(const std::string &name); // Carga la animación desde un vector bool loadFromVector(std::vector *source); // Establece la animacion actual void setCurrentAnimation(const std::string &name = "default"); void setCurrentAnimation(int index = 0); // Actualiza las variables del objeto void update() override; // OLD - Establece el rectangulo para un frame de una animación void setAnimationFrames(Uint8 index_animation, Uint8 index_frame, int x, int y, int w, int h); // OLD - Establece el contador para todas las animaciones void setAnimationCounter(int value); // Reinicia la animación void resetAnimation(); };