magic numbers: moving_sprite.cpp i game_logo.cpp
This commit is contained in:
63
deltatime_cleanup_plan.md
Normal file
63
deltatime_cleanup_plan.md
Normal file
@@ -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
|
||||
@@ -42,7 +42,7 @@ Director::Director(int argc, std::span<char *> 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;
|
||||
|
||||
@@ -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<float>(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<float>(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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<int>(x_);
|
||||
pos_.y = static_cast<int>(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<float>(rotate_.speed) * (1000.0f / 60.0f);
|
||||
rotate_.angle += rotate_.amount * (deltaTime / rotationFrameTime);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user