From 66d55061ddb6cc928cf881bd58c6a1587148093d Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 11 Jul 2025 22:57:51 +0200 Subject: [PATCH] =?UTF-8?q?AnimatedSprite:=20posibilitat=20de=20resetejar?= =?UTF-8?q?=20o=20no=20el=20estat=20de=20la=20animaci=C3=B3=20en=20setCurr?= =?UTF-8?q?entAnimation();?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/animated_sprite.cpp | 50 ++++++++++++++++++++++++++------------ source/animated_sprite.h | 10 ++++---- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/source/animated_sprite.cpp b/source/animated_sprite.cpp index dd1207b..bf7b2ab 100644 --- a/source/animated_sprite.cpp +++ b/source/animated_sprite.cpp @@ -82,7 +82,7 @@ void AnimatedSprite::animate() // Si alcanza el final de la animación, reinicia el contador de la animación // en función de la variable loop y coloca el nuevo frame - if (animations_[current_animation_].current_frame >= (int)animations_[current_animation_].frames.size()) + if (animations_[current_animation_].current_frame >= animations_[current_animation_].frames.size()) { if (animations_[current_animation_].loop == -1) { // Si no hay loop, deja el último frame @@ -113,28 +113,48 @@ bool AnimatedSprite::animationIsCompleted() } // Establece la animacion actual -void AnimatedSprite::setCurrentAnimation(const std::string &name) +void AnimatedSprite::setCurrentAnimation(const std::string &name, bool reset) { - const auto new_animation = getIndex(name); - if (current_animation_ != new_animation) + const auto NEW_ANIMATION = getIndex(name); + if (current_animation_ != NEW_ANIMATION) { - current_animation_ = new_animation; - animations_[current_animation_].current_frame = 0; - animations_[current_animation_].counter = 0; - animations_[current_animation_].completed = false; + const auto OLD_ANIMATION = current_animation_; + current_animation_ = NEW_ANIMATION; + if (reset) + { + animations_[current_animation_].current_frame = 0; + animations_[current_animation_].counter = 0; + animations_[current_animation_].completed = false; + } + else + { + animations_[current_animation_].current_frame = std::min(animations_[OLD_ANIMATION].current_frame, animations_[current_animation_].frames.size()); + animations_[current_animation_].counter = animations_[OLD_ANIMATION].counter; + animations_[current_animation_].completed = animations_[OLD_ANIMATION].completed; + } } } // Establece la animacion actual -void AnimatedSprite::setCurrentAnimation(int index) +void AnimatedSprite::setCurrentAnimation(int index, bool reset) { - const auto new_animation = index; - if (current_animation_ != new_animation) + const auto NEW_ANIMATION = index; + if (current_animation_ != NEW_ANIMATION) { - current_animation_ = new_animation; - animations_[current_animation_].current_frame = 0; - animations_[current_animation_].counter = 0; - animations_[current_animation_].completed = false; + const auto OLD_ANIMATION = current_animation_; + current_animation_ = NEW_ANIMATION; + if (reset) + { + animations_[current_animation_].current_frame = 0; + animations_[current_animation_].counter = 0; + animations_[current_animation_].completed = false; + } + else + { + animations_[current_animation_].current_frame = std::min(animations_[OLD_ANIMATION].current_frame, animations_[current_animation_].frames.size()); + animations_[current_animation_].counter = animations_[OLD_ANIMATION].counter; + animations_[current_animation_].completed = animations_[OLD_ANIMATION].completed; + } } } diff --git a/source/animated_sprite.h b/source/animated_sprite.h index 0e48534..9d97576 100644 --- a/source/animated_sprite.h +++ b/source/animated_sprite.h @@ -18,7 +18,7 @@ struct Animation int speed; // Velocidad de reproducción int loop; // Frame de vuelta al terminar (-1 para no repetir) bool completed; // Indica si la animación ha finalizado - int current_frame; // Frame actual en reproducción + size_t current_frame; // Frame actual en reproducción int counter; // Contador para la animación Animation() : name(std::string()), speed(5), loop(0), completed(false), current_frame(0), counter(0) {} @@ -44,10 +44,10 @@ public: void update() override; // Actualiza la animación // --- Control de animaciones --- - void setCurrentAnimation(const std::string &name = "default"); // Establece la animación por nombre - void setCurrentAnimation(int index = 0); // Establece la animación por índice - void resetAnimation(); // Reinicia la animación actual - void setAnimationSpeed(size_t value); // Establece la velocidad de la animación + void setCurrentAnimation(const std::string &name = "default", bool reset = true); // Establece la animación por nombre + void setCurrentAnimation(int index = 0, bool reset = true); // Establece la animación por índice + void resetAnimation(); // Reinicia la animación actual + void setAnimationSpeed(size_t value); // Establece la velocidad de la animación // --- Consultas --- bool animationIsCompleted(); // Comprueba si la animación ha terminado