From 77718d4515a56ced550c21555d8c6f7357480586 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Mon, 18 May 2026 17:37:45 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20powerball=20perdia=20la=20rotaci=C3=B3?= =?UTF-8?q?=20en=20passar=20Game::startAllBalloons=20(post=20rellotge);=20?= =?UTF-8?q?setStop=20sincronitza=20ara=20la=20rotaci=C3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/game/entities/balloon.cpp | 39 ++++++++++++-------------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/source/game/entities/balloon.cpp b/source/game/entities/balloon.cpp index 928c2c3..364fd95 100644 --- a/source/game/entities/balloon.cpp +++ b/source/game/entities/balloon.cpp @@ -212,14 +212,12 @@ Balloon::Balloon(float x, float y, Uint8 kind, float velx, float speed, Uint16 c // Amenaza que genera el globo menace_ = 0; - // Añade rotación al sprite - sprite_->setRotate(false); - sprite_->setRotateSpeed(0); - if (vel_x_ > 0.0F) { - sprite_->setRotateAmount(2.0); - } else { - sprite_->setRotateAmount(-2.0); - } + // Configura la rotació del sprite. L'activació/desactivació es + // delega a `setStop()`, que la sincronitza amb l'estat stopped_ + // sempre que canvia. setRotateSpeed(1) evita la UB del `counter_ + // % 0` dins MovingSprite::rotate(). + sprite_->setRotateSpeed(1); + sprite_->setRotateAmount(vel_x_ > 0.0F ? 2.0 : -2.0); break; @@ -536,34 +534,21 @@ void Balloon::updateStateBeingCreated() { // El contador ha llegado a cero else { setBeingCreated(false); - setStop(false); + setStop(false); // reactiva la rotació de la PowerBall si escau setVisible(true); setInvulnerable(false); - if (kind_ == POWER_BALL) { - sprite_->setRotate(true); - } } } // Rama de updateState: globo detenido (no creándose) void Balloon::updateStateStopped() { - // Si es una powerball deja de rodar - if (kind_ == POWER_BALL) { - sprite_->setRotate(false); - } - // Reduce el contador if (stopped_counter_ > 0) { stopped_counter_--; } // Quitarles el estado "detenido" si no estan explosionando else if (!isPopping()) { - // Si es una powerball vuelve a rodar - if (kind_ == POWER_BALL) { - sprite_->setRotate(true); - } - - setStop(false); + setStop(false); // reactiva la rotació de la PowerBall si escau } } @@ -655,9 +640,15 @@ auto Balloon::getClass() const -> Uint8 { return BALLOON_CLASS; } -// Establece el valor de la variable +// Establece el valor de la variable. Per a la PowerBall sincronitza la +// rotació del sprite: stopped=true ⇒ no roda, stopped=false ⇒ roda. Així, +// vingui d'on vingui la crida (FSM intern, Game::stopAll/startAllBalloons, +// fi de creació, etc.), la rotació sempre queda coherent amb l'estat. void Balloon::setStop(bool state) { stopped_ = state; + if (kind_ == POWER_BALL) { + sprite_->setRotate(!stopped_); + } } // Obtiene del valor de la variable