From 8f83a1d13edd2182ab360b3cc74eac0519c52885 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Mon, 22 Sep 2025 13:57:58 +0200 Subject: [PATCH] magic numbers: moving_sprite.cpp i game_logo.cpp --- deltatime_cleanup_plan.md | 63 +++++++++++++++++++++++++++++++++++++++ source/director.cpp | 2 +- source/game_logo.cpp | 44 +++++++++++++-------------- source/game_logo.h | 11 +++++++ source/moving_sprite.cpp | 15 +++++----- 5 files changed, 104 insertions(+), 31 deletions(-) create mode 100644 deltatime_cleanup_plan.md diff --git a/deltatime_cleanup_plan.md b/deltatime_cleanup_plan.md new file mode 100644 index 0000000..a7cd4f8 --- /dev/null +++ b/deltatime_cleanup_plan.md @@ -0,0 +1,63 @@ +# Plan de Limpieza Post-Migración DeltaTime + +## Estado Actual +✅ Migración básica completada: bullet.cpp, item.cpp, moving_sprite.cpp, game_logo.cpp +✅ Magic numbers convertidos a constantes en game_logo.cpp + +## Tareas Pendientes + +### 1. Eliminar Contadores Frame-Based +- [ ] Buscar todos los contadores que usen lógica frame-based +- [ ] Convertir a timers basados en deltaTime +- [ ] Eliminar variables como `counter_`, `frame_counter_`, etc. +- [ ] Patrón: `if (counter-- <= 0)` → `if (timer >= DURATION_MS)` + +### 2. Revisar Inicializaciones de Aceleraciones MovingSprite +- [ ] Buscar todas las llamadas a `setAccelX()`, `setAccelY()` +- [ ] Buscar asignaciones directas a `ax_`, `ay_` +- [ ] Convertir de `pixels/frame²` a `pixels/ms²` +- [ ] Factor de conversión: `valor_original / (16.67)²` + +### 3. Problema Detectado: Demo - Creación Incorrecta de Globos +- [ ] Investigar cómo se crean los globos en modo demo +- [ ] Verificar si usan timing frame-based obsoleto +- [ ] Corregir la lógica de creación para deltaTime + +### 4. Búsqueda de Patrones Problemáticos +- [ ] Buscar `frameFactor` residual +- [ ] Buscar `1000.0f / 60.0f` hardcodeado +- [ ] Buscar `16.67f` hardcodeado +- [ ] Buscar comentarios con "frame" o "60fps" + +### 5. Archivos Prioritarios a Revisar +- [ ] **player.cpp** - puede tener aceleraciones +- [ ] **balloon.cpp** - contadores de estado +- [ ] **stage.cpp** - timers de nivel +- [ ] **credits.cpp** - efectos de texto +- [ ] **tabe.cpp** - movimiento del protagonista +- [ ] **sections/*.cpp** - transiciones y efectos + +### 6. Validación Final +- [ ] Compilar sin warnings +- [ ] Probar gameplay normal +- [ ] Probar modo demo +- [ ] Verificar que no hay saltos de velocidad +- [ ] Confirmar que el timing es consistente en diferentes framerates + +## Comandos Útiles de Búsqueda +```bash +# Buscar contadores frame-based +rg "counter.*--|\+\+.*counter|counter.*\+\+|--.*counter" + +# Buscar inicializaciones de aceleración +rg "setAccel|\.ax.*=|\.ay.*=" + +# Buscar hardcoded framerates +rg "60\.0|16\.67|1000\.0.*60" +``` + +## Notas +- Mantener consistencia: velocidades en `pixels/ms`, aceleraciones en `pixels/ms²` +- Documentar las conversiones en comentarios +- Crear constantes para valores repetidos +- Evitar números mágicos \ No newline at end of file diff --git a/source/director.cpp b/source/director.cpp index 31055e2..525f3cf 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -42,7 +42,7 @@ Director::Director(int argc, std::span argv) { Section::name = Section::Name::GAME; Section::options = Section::Options::GAME_PLAY_1P; #elif _DEBUG - Section::name = Section::Name::GAME; + Section::name = Section::Name::TITLE; Section::options = Section::Options::GAME_PLAY_1P; #else // NORMAL GAME Section::name = Section::Name::LOGO; diff --git a/source/game_logo.cpp b/source/game_logo.cpp index 6856ffd..a8a1832 100644 --- a/source/game_logo.cpp +++ b/source/game_logo.cpp @@ -53,9 +53,9 @@ void GameLogo::init() { coffee_sprite_->setWidth(coffee_texture_->getWidth()); coffee_sprite_->setHeight(coffee_texture_->getHeight()); coffee_sprite_->setVelX(0.0F); - coffee_sprite_->setVelY(2.5F); + coffee_sprite_->setVelY(COFFEE_VEL_Y); coffee_sprite_->setAccelX(0.0F); - coffee_sprite_->setAccelY(0.1F); + coffee_sprite_->setAccelY(COFFEE_ACCEL_Y); coffee_sprite_->setSpriteClip(0, 0, coffee_texture_->getWidth(), coffee_texture_->getHeight()); coffee_sprite_->setEnabled(true); coffee_sprite_->setFinishedCounter(0); @@ -63,34 +63,34 @@ void GameLogo::init() { coffee_sprite_->setDestY(y_ - coffee_texture_->getHeight()); // Inicializa el bitmap de 'Crisis' - crisis_sprite_->setPosX(XP + 15); + crisis_sprite_->setPosX(XP + CRISIS_OFFSET_X); crisis_sprite_->setPosY(y_ + DESP); crisis_sprite_->setWidth(crisis_texture_->getWidth()); crisis_sprite_->setHeight(crisis_texture_->getHeight()); crisis_sprite_->setVelX(0.0F); - crisis_sprite_->setVelY(-2.5F); + crisis_sprite_->setVelY(CRISIS_VEL_Y); crisis_sprite_->setAccelX(0.0F); - crisis_sprite_->setAccelY(-0.1F); + crisis_sprite_->setAccelY(CRISIS_ACCEL_Y); crisis_sprite_->setSpriteClip(0, 0, crisis_texture_->getWidth(), crisis_texture_->getHeight()); crisis_sprite_->setEnabled(true); crisis_sprite_->setFinishedCounter(0); - crisis_sprite_->setDestX(XP + 15); + crisis_sprite_->setDestX(XP + CRISIS_OFFSET_X); crisis_sprite_->setDestY(y_); // Inicializa el bitmap de 'DustRight' dust_right_sprite_->resetAnimation(); dust_right_sprite_->setPosX(coffee_sprite_->getPosX() + coffee_sprite_->getWidth()); dust_right_sprite_->setPosY(y_); - dust_right_sprite_->setWidth(16); - dust_right_sprite_->setHeight(16); + dust_right_sprite_->setWidth(DUST_SIZE); + dust_right_sprite_->setHeight(DUST_SIZE); dust_right_sprite_->setFlip(SDL_FLIP_HORIZONTAL); // Inicializa el bitmap de 'DustLeft' dust_left_sprite_->resetAnimation(); - dust_left_sprite_->setPosX(coffee_sprite_->getPosX() - 16); + dust_left_sprite_->setPosX(coffee_sprite_->getPosX() - DUST_SIZE); dust_left_sprite_->setPosY(y_); - dust_left_sprite_->setWidth(16); - dust_left_sprite_->setHeight(16); + dust_left_sprite_->setWidth(DUST_SIZE); + dust_left_sprite_->setHeight(DUST_SIZE); // Inicializa el bitmap de 'Arcade Edition' arcade_edition_sprite_->setZoom(zoom_); @@ -174,8 +174,8 @@ void GameLogo::handleCoffeeCrisisFinished(float deltaTime) { } void GameLogo::handleArcadeEditionMoving(float deltaTime) { - // Convertir 0.1F * ZOOM_FACTOR por frame a por milisegundo (asumiendo 60fps) - zoom_ -= (0.1F * ZOOM_FACTOR) * deltaTime / (1000.0F / 60.0F); + // DeltaTime puro: decremento por milisegundo + zoom_ -= (ZOOM_DECREMENT_PER_MS * ZOOM_FACTOR) * deltaTime; arcade_edition_sprite_->setZoom(zoom_); if (zoom_ <= 1.0F) { @@ -200,15 +200,15 @@ void GameLogo::processShakeEffect(SmartSprite* primary_sprite, SmartSprite* seco const auto DISPLACEMENT = calculateShakeDisplacement(); primary_sprite->setPosX(shake_.origin + DISPLACEMENT); if (secondary_sprite != nullptr) { - secondary_sprite->setPosX(shake_.origin + DISPLACEMENT + 15); + secondary_sprite->setPosX(shake_.origin + DISPLACEMENT + CRISIS_OFFSET_X); } shake_.remaining--; } } void GameLogo::processShakeEffect(SmartSprite* primary_sprite, SmartSprite* secondary_sprite, float deltaTime) { - // Convertir delay (frames) a tiempo: delay frames = delay * (1000ms/60fps) - float delayTime = static_cast(shake_.delay) * (1000.0f / 60.0f); + // Delay fijo en milisegundos (shake_.delay era frames, ahora usamos constante) + float delayTime = SHAKE_DELAY_MS; shake_.time_accumulator += deltaTime; @@ -217,15 +217,15 @@ void GameLogo::processShakeEffect(SmartSprite* primary_sprite, SmartSprite* seco const auto DISPLACEMENT = calculateShakeDisplacement(); primary_sprite->setPosX(shake_.origin + DISPLACEMENT); if (secondary_sprite != nullptr) { - secondary_sprite->setPosX(shake_.origin + DISPLACEMENT + 15); + secondary_sprite->setPosX(shake_.origin + DISPLACEMENT + CRISIS_OFFSET_X); } shake_.remaining--; } } void GameLogo::processArcadeEditionShake(float deltaTime) { - // Convertir delay (frames) a tiempo: delay frames = delay * (1000ms/60fps) - float delayTime = static_cast(shake_.delay) * (1000.0f / 60.0f); + // Delay fijo en milisegundos (shake_.delay era frames, ahora usamos constante) + float delayTime = SHAKE_DELAY_MS; shake_.time_accumulator += deltaTime; @@ -243,7 +243,7 @@ auto GameLogo::calculateShakeDisplacement() const -> int { void GameLogo::finishCoffeeCrisisShaking() { coffee_sprite_->setPosX(shake_.origin); - crisis_sprite_->setPosX(shake_.origin + 15); + crisis_sprite_->setPosX(shake_.origin + CRISIS_OFFSET_X); coffee_crisis_status_ = Status::FINISHED; arcade_edition_status_ = Status::MOVING; } @@ -272,8 +272,8 @@ void GameLogo::updatePostFinishedCounter(float deltaTime) { arcade_edition_status_ == Status::FINISHED && post_finished_counter_ > 0) { - // Convertir 1 frame a tiempo: 1 frame = 1000ms/60fps = 16.67ms - float frameTime = 1000.0f / 60.0f; + // Tiempo entre decrementos del counter + float frameTime = POST_FINISHED_FRAME_TIME; post_finished_time_accumulator_ += deltaTime; diff --git a/source/game_logo.h b/source/game_logo.h index 1cece8a..0159d9e 100644 --- a/source/game_logo.h +++ b/source/game_logo.h @@ -11,6 +11,17 @@ class Texture; // --- Clase GameLogo: gestor del logo del juego --- class GameLogo { public: + // --- Constantes --- + static constexpr float COFFEE_VEL_Y = 0.15F; // Velocidad Y de coffee sprite (pixels/ms) - 2.5F/16.67 + static constexpr float COFFEE_ACCEL_Y = 0.00036F; // Aceleración Y de coffee sprite (pixels/ms²) - 0.1F/(16.67)² + static constexpr float CRISIS_VEL_Y = -0.15F; // Velocidad Y de crisis sprite (pixels/ms) - -2.5F/16.67 + static constexpr float CRISIS_ACCEL_Y = -0.00036F; // Aceleración Y de crisis sprite (pixels/ms²) - -0.1F/(16.67)² + static constexpr int CRISIS_OFFSET_X = 15; // Desplazamiento X de crisis sprite + static constexpr int DUST_SIZE = 16; // Tamaño de dust sprites + static constexpr float ZOOM_DECREMENT_PER_MS = 0.006F; // Decremento de zoom por milisegundo (0.1F/16.67ms) + static constexpr float SHAKE_DELAY_MS = 33.34F; // Delay de shake en milisegundos (2 frames * 16.67ms) + static constexpr float POST_FINISHED_FRAME_TIME = 16.67F; // Tiempo entre decrementos del counter (1 frame) + // --- Constructores y destructor --- GameLogo(int x, int y); ~GameLogo() = default; diff --git a/source/moving_sprite.cpp b/source/moving_sprite.cpp index 78bc3c6..2cb128d 100644 --- a/source/moving_sprite.cpp +++ b/source/moving_sprite.cpp @@ -55,14 +55,13 @@ void MovingSprite::stop() { // Mueve el sprite (time-based) void MovingSprite::move(float deltaTime) { - // Convertir deltaTime (milisegundos) a factor de frame (asumiendo 60fps) - float frameFactor = deltaTime / (1000.0f / 60.0f); - - x_ += vx_ * frameFactor; - y_ += vy_ * frameFactor; + // DeltaTime puro: velocidad (pixels/ms) * tiempo (ms) + x_ += vx_ * deltaTime; + y_ += vy_ * deltaTime; - vx_ += ax_ * frameFactor; - vy_ += ay_ * frameFactor; + // Aceleración (pixels/ms²) * tiempo (ms) + vx_ += ax_ * deltaTime; + vy_ += ay_ * deltaTime; pos_.x = static_cast(x_); pos_.y = static_cast(y_); @@ -82,7 +81,7 @@ void MovingSprite::render() { // Establece la rotacion (time-based) void MovingSprite::rotate(float deltaTime) { if (rotate_.enabled) { - // Convertir speed (frames) a tiempo: speed frames = speed * (1000ms/60fps) milisegundos + // DeltaTime puro: velocidad de rotación debe estar en unidades/ms float rotationFrameTime = static_cast(rotate_.speed) * (1000.0f / 60.0f); rotate_.angle += rotate_.amount * (deltaTime / rotationFrameTime); }