fix: powerball perdia la rotació en passar Game::startAllBalloons (post rellotge); setStop sincronitza ara la rotació

This commit is contained in:
2026-05-18 17:37:45 +02:00
parent 3ac495f444
commit 77718d4515
+15 -24
View File
@@ -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