136 lines
6.4 KiB
Markdown
136 lines
6.4 KiB
Markdown
# Plan de Reparación: game.cpp - Limpieza DeltaTime
|
|
|
|
## Estado Actual
|
|
✅ `calculateDeltaTime()` convertido a segundos
|
|
✅ Constantes de tiempo convertidas de `_MS` a `_S`
|
|
✅ Eliminados hardcoded `1000.0f / 60.0f`
|
|
✅ `throwCoffee()` velocidades convertidas a pixels/segundo
|
|
✅ Frame-based counter en `updateGameStateShowingGetReadyMessage()` convertido a timer con flag
|
|
|
|
## Problemas Detectados Pendientes
|
|
|
|
### ✅ COMPLETADO
|
|
1. **Valores hardcoded frame-based (60, 16.67, 1000/60)** - Solo quedan las conversiones correctas
|
|
2. **SmartSprite setFinishedDelay() calls** - Correcto (0.0F está bien)
|
|
3. **Velocidades y aceleraciones** - Todas convertidas correctamente
|
|
4. **Timer variables** - Todas usan deltaTime correctamente
|
|
|
|
### ❌ PENDIENTES DE REPARAR
|
|
|
|
#### ✅ **SOLUCIONADO: Balas no se mueven**
|
|
- **Síntoma**: Las balas se crean pero no avanzan en pantalla
|
|
- **Causa encontrada**: Velocidades en `bullet.h` seguían en pixels/ms pero `calculateDeltaTime()` ahora devuelve segundos
|
|
- **Solución aplicada**:
|
|
- `VEL_Y = -0.18F` → `VEL_Y = -180.0F` (pixels/segundo)
|
|
- `VEL_X_LEFT = -0.12F` → `VEL_X_LEFT = -120.0F` (pixels/segundo)
|
|
- `VEL_X_RIGHT = 0.12F` → `VEL_X_RIGHT = 120.0F` (pixels/segundo)
|
|
- Actualizado comentario en `bullet.cpp`: "pixels/ms" → "pixels/segundo"
|
|
|
|
#### ✅ **SOLUCIONADO: Contadores frame-based (++ o -- operations)**
|
|
- **Problema**: `demo_.counter++` en líneas 1665, 1691
|
|
- **Ubicación**: `updateDemo()` y `updateRecording()`
|
|
- **Contexto**: `demo_.counter` indexa un vector con datos de teclas por frame (ej: 2000 frames = 2000 entradas)
|
|
- **Solución aplicada**: Acumulador de tiempo que se incrementa cada 16.67ms (1/60 segundos)
|
|
- **Implementación**:
|
|
```cpp
|
|
// updateDemo()
|
|
static float demo_frame_timer = 0.0f;
|
|
demo_frame_timer += calculateDeltaTime();
|
|
if (demo_frame_timer >= 0.01667f && demo_.counter < TOTAL_DEMO_DATA) {
|
|
demo_.counter++;
|
|
demo_frame_timer -= 0.01667f; // Mantener precisión acumulada
|
|
}
|
|
|
|
// updateRecording()
|
|
static float recording_frame_timer = 0.0f;
|
|
recording_frame_timer += calculateDeltaTime();
|
|
if (recording_frame_timer >= 0.01667f && demo_.counter < TOTAL_DEMO_DATA) {
|
|
demo_.counter++;
|
|
recording_frame_timer -= 0.01667f; // Mantener precisión acumulada
|
|
}
|
|
```
|
|
|
|
#### 6. **Fade duration values (milisegundos vs segundos)**
|
|
- **Problema 1**: `fade_out_->setPostDuration(500);` línea 234
|
|
- **Problema 2**: `fade_out_->setPostDuration(param.fade.post_duration_ms);` líneas 89, 1671
|
|
- **Solución**: Verificar si `param.fade.post_duration_ms` debe ser convertido a segundos
|
|
|
|
### NUEVOS PROBLEMAS A AÑADIR
|
|
|
|
#### 7. **Verificar param.fade estructura**
|
|
- Revisar si `param.fade.post_duration_ms` debe ser convertido a segundos
|
|
- Verificar todas las propiedades de `param.fade` relacionadas con tiempo
|
|
|
|
#### 8. **Revisar constantes TOTAL_DEMO_DATA**
|
|
- **Problema**: `TOTAL_DEMO_DATA - 200` en línea 1669
|
|
- **Detalle**: 200 frames hardcoded, debería ser tiempo en segundos
|
|
|
|
#### 9. **Buscar más magic numbers relacionados con tiempo**
|
|
- Buscar números como 100, 150, 200, 500 que puedan ser frames
|
|
- Verificar contexto de cada uno
|
|
|
|
#### 10. **Revisar setRotateSpeed() values**
|
|
- **Problema**: `setRotateSpeed(10)` línea 797
|
|
- **Verificar**: Si debe ser convertido de rotaciones/frame a rotaciones/segundo
|
|
|
|
#### ✅ **VERIFICADO: SDL_Delay() calls**
|
|
- **Problema**: `SDL_Delay(param.game.hit_stop_ms);` línea 847
|
|
- **Ubicación**: `handlePlayerCollision()`
|
|
- **Contexto**: Pausa el juego al recibir daño (hitStop effect)
|
|
- **Resultado**: `param.game.hit_stop_ms` está configurado explícitamente en milisegundos en archivos .txt
|
|
- **Conclusión**: Correcto, `SDL_Delay()` espera milisegundos y `hit_stop_ms` ya está en milisegundos
|
|
|
|
#### ✅ **VERIFICADO: Cooldown de disparos en frames**
|
|
- **Problema**: `handleFireInput()` líneas 1312-1314
|
|
- **Detalle**: `POWERUP_COOLDOWN = 5`, `AUTOFIRE_COOLDOWN = 10`, `NORMAL_COOLDOWN = 7`
|
|
- **Contexto**: Son frames de cooldown, se pasan a `player->startFiringSystem(cant_fire_counter)`
|
|
- **Resultado**: `startFiringSystem()` convierte internamente frames a segundos con: `fire_cooldown_timer_ = static_cast<float>(cooldown_frames) / 60.0f;`
|
|
- **Conclusión**: No necesita cambios, la conversión ya está implementada correctamente
|
|
|
|
#### 12. **Revisar paths y PathSprite durations**
|
|
- **Problema**: En `initPaths()` líneas 1024, 1025, 1036, 1037, 1049, 1050, 1062, 1063
|
|
- **Detalle**: `createPath(..., 80, ...), 20);` - Los números 80 y 20 son frames
|
|
- **Ejemplo**: `paths_.emplace_back(createPath(X0, X1, PathType::HORIZONTAL, Y, 80, easeOutQuint), 20);`
|
|
- **Investigar**: Si createPath espera segundos o milisegundos
|
|
- **Conversión**: 80 frames = 80/60 = 1.33s, 20 frames = 20/60 = 0.33s
|
|
- **Verificar**: Documentación de createPath() y PathSprite para unidades correctas
|
|
|
|
## Herramientas de Búsqueda Útiles
|
|
|
|
```bash
|
|
# Buscar magic numbers de tiempo
|
|
rg "\b(100|150|200|250|300|400|500|1000)\b" --context=2
|
|
|
|
# Buscar más frame-based operations
|
|
rg "setRotateSpeed|SDL_Delay|createPath.*[0-9]+"
|
|
|
|
# Buscar estructuras param que mencionen tiempo
|
|
rg "param\..*\.(duration|time|delay|ms|frames)"
|
|
|
|
# Buscar comentarios con "frame" or "60fps"
|
|
rg "(frame|60fps|milliseconds)" --ignore-case
|
|
```
|
|
|
|
## Prioridad de Reparación
|
|
|
|
### ✅ COMPLETADAS
|
|
1. ✅ **CRÍTICA**: Las balas no se desplazan - **SOLUCIONADO**: Velocidades convertidas de pixels/ms a pixels/segundo
|
|
2. ✅ **ALTA**: demo_.counter system - **SOLUCIONADO**: Implementados acumuladores de tiempo
|
|
3. ✅ **ALTA**: Fade durations hardcoded - **SOLUCIONADO**: Convertidos a segundos
|
|
4. ✅ **ALTA**: initPaths() frame values - **SOLUCIONADO**: Convertidos a segundos
|
|
5. ✅ **MEDIA**: Cooldown de disparos - **VERIFICADO**: Ya convierte internamente frames a segundos
|
|
6. ✅ **BAJA**: SDL_Delay investigation - **VERIFICADO**: Correcto, usa milisegundos
|
|
|
|
### ❌ PENDIENTES
|
|
7. **MEDIA**: param.fade.post_duration_ms verification (líneas 89, 1671)
|
|
8. **MEDIA**: TOTAL_DEMO_DATA - 200 magic number (línea 1669) - Nota: No necesita cambios, lógica correcta
|
|
9. **BAJA**: setRotateSpeed verification (línea 797)
|
|
10. **BAJA**: Comprehensive magic number search
|
|
|
|
## Notas Importantes
|
|
|
|
- **TODOS los contadores deben ser crecientes** (0 → constante_tope)
|
|
- **SOLO SEGUNDOS** en todo el codebase, NO frames ni milisegundos simultáneos
|
|
- **Documentar conversiones** con comentarios explicativos
|
|
- **Crear constantes** para valores repetidos
|
|
- **Evitar números mágicos** sin contexto |