6.4 KiB
6.4 KiB
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
- Valores hardcoded frame-based (60, 16.67, 1000/60) - Solo quedan las conversiones correctas
- SmartSprite setFinishedDelay() calls - Correcto (0.0F está bien)
- Velocidades y aceleraciones - Todas convertidas correctamente
- 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.hseguían en pixels/ms perocalculateDeltaTime()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()yupdateRecording() - Contexto:
demo_.counterindexa 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:
// 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_msdebe ser convertido a segundos
NUEVOS PROBLEMAS A AÑADIR
7. Verificar param.fade estructura
- Revisar si
param.fade.post_duration_msdebe ser convertido a segundos - Verificar todas las propiedades de
param.faderelacionadas con tiempo
8. Revisar constantes TOTAL_DEMO_DATA
- Problema:
TOTAL_DEMO_DATA - 200en 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_msestá configurado explícitamente en milisegundos en archivos .txt - Conclusión: Correcto,
SDL_Delay()espera milisegundos yhit_stop_msya 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
# 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
- ✅ CRÍTICA: Las balas no se desplazan - SOLUCIONADO: Velocidades convertidas de pixels/ms a pixels/segundo
- ✅ ALTA: demo_.counter system - SOLUCIONADO: Implementados acumuladores de tiempo
- ✅ ALTA: Fade durations hardcoded - SOLUCIONADO: Convertidos a segundos
- ✅ ALTA: initPaths() frame values - SOLUCIONADO: Convertidos a segundos
- ✅ MEDIA: Cooldown de disparos - VERIFICADO: Ya convierte internamente frames a segundos
- ✅ BAJA: SDL_Delay investigation - VERIFICADO: Correcto, usa milisegundos
❌ PENDIENTES
- MEDIA: param.fade.post_duration_ms verification (líneas 89, 1671)
- MEDIA: TOTAL_DEMO_DATA - 200 magic number (línea 1669) - Nota: No necesita cambios, lógica correcta
- BAJA: setRotateSpeed verification (línea 797)
- 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