revisant la seccio game: bales, items e inici

This commit is contained in:
2025-09-24 11:37:23 +02:00
parent 2977869ab5
commit c9a29e26dd
7 changed files with 165 additions and 21 deletions

View File

@@ -10,7 +10,7 @@ frames=0,1,2,3
[animation]
name=stand
speed=0.0167
speed=0.167
loop=0
frames=4,5,6,7
[/animation]
@@ -101,14 +101,14 @@ frames=37
[animation]
name=rolling
speed=0.0167
speed=0.167
loop=0
frames=38,39,40,41
[/animation]
[animation]
name=celebration
speed=0.0167
speed=0.167
loop=-1
frames=42,42,42,42,42,42,43,44,45,46,46,46,46,46,46,45,45,45,46,46,46,45,45,45,44,43,42,42,42
[/animation]

136
game_cpp_repair_plan.md Normal file
View File

@@ -0,0 +1,136 @@
# 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

View File

@@ -68,7 +68,7 @@ auto Bullet::update(float deltaTime) -> BulletMoveStatus {
// Implementación del movimiento usando BulletMoveStatus (time-based)
auto Bullet::move(float deltaTime) -> BulletMoveStatus {
// DeltaTime puro: velocidad (pixels/ms) * tiempo (ms)
// DeltaTime puro: velocidad (pixels/segundo) * tiempo (segundos)
pos_x_ += vel_x_ * deltaTime;
if (pos_x_ < param.game.play_area.rect.x - WIDTH || pos_x_ > param.game.play_area.rect.w) {
disable();

View File

@@ -45,9 +45,9 @@ class Bullet {
private:
// --- Constantes ---
static constexpr float VEL_Y = -0.18F; // Velocidad vertical (pixels/ms)
static constexpr float VEL_X_LEFT = -0.12F; // Velocidad izquierda (pixels/ms)
static constexpr float VEL_X_RIGHT = 0.12F; // Velocidad derecha (pixels/ms)
static constexpr float VEL_Y = -180.0F; // Velocidad vertical (pixels/segundo) - era -0.18F pixels/ms
static constexpr float VEL_X_LEFT = -120.0F; // Velocidad izquierda (pixels/segundo) - era -0.12F pixels/ms
static constexpr float VEL_X_RIGHT = 120.0F; // Velocidad derecha (pixels/segundo) - era 0.12F pixels/ms
static constexpr float VEL_X_CENTER = 0.0F; // Velocidad central
// --- Objetos y punteros ---

View File

@@ -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::TITLE;
Section::name = Section::Name::GAME;
Section::options = Section::Options::GAME_PLAY_1P;
#else // NORMAL GAME
Section::name = Section::Name::LOGO;

View File

@@ -32,15 +32,15 @@ class Item {
static constexpr float LIFETIME_DURATION_S = 10.0f; // Duración de vida del ítem en segundos
// Velocidades base (pixels/segundo) - Coffee Machine
static constexpr float COFFEE_MACHINE_VEL_X_FACTOR = 1.8F; // Factor para velocidad X de máquina de café (0.03*60)
static constexpr float COFFEE_MACHINE_VEL_Y = -0.36F; // Velocidad Y inicial de máquina de café (-0.006*60)
static constexpr float COFFEE_MACHINE_ACCEL_Y = 1.296F; // Aceleración Y de máquina de café (pixels/segundo²)
static constexpr float COFFEE_MACHINE_VEL_X_FACTOR = 30.0F; // Factor para velocidad X de máquina de café (0.5*60fps)
static constexpr float COFFEE_MACHINE_VEL_Y = -6.0F; // Velocidad Y inicial de máquina de café (-0.1*60fps)
static constexpr float COFFEE_MACHINE_ACCEL_Y = 360.0F; // Aceleración Y de máquina de café (0.1*60²fps = 360 pixels/segundo²)
// Velocidades base (pixels/segundo) - Items normales
static constexpr float ITEM_VEL_X_BASE = 60.0F; // Velocidad X base para items (1.0F*60fps)
static constexpr float ITEM_VEL_X_STEP = 20.0F; // Incremento de velocidad X (0.33F*60fps)
static constexpr float ITEM_VEL_Y = -240.0F; // Velocidad Y inicial de items (-4.0F*60fps)
static constexpr float ITEM_ACCEL_Y = 12.0F; // Aceleración Y de items (pixels/segundo²)
static constexpr float ITEM_ACCEL_Y = 720.0F; // Aceleración Y de items (0.2*60²fps = 720 pixels/segundo²)
// Constantes de física de rebote
static constexpr float BOUNCE_VEL_THRESHOLD = 60.0F; // Umbral de velocidad para parar (1.0F*60fps)

View File

@@ -1021,7 +1021,7 @@ void Game::initPaths() {
const int X1 = param.game.play_area.center_x - (W / 2);
const int X2 = param.game.play_area.rect.w;
const int Y = param.game.play_area.center_y;
paths_.emplace_back(createPath(X0, X1, PathType::HORIZONTAL, Y, 80, easeOutQuint), 20);
paths_.emplace_back(createPath(X0, X1, PathType::HORIZONTAL, Y, 80, easeOutQuint), 0.33f); // 20 frames → segundos
paths_.emplace_back(createPath(X1, X2, PathType::HORIZONTAL, Y, 80, easeInQuint), 0);
}
@@ -1033,7 +1033,7 @@ void Game::initPaths() {
const int Y1 = param.game.play_area.center_y - (H / 2);
const int Y2 = -H;
const int X = param.game.play_area.center_x;
paths_.emplace_back(createPath(Y0, Y1, PathType::VERTICAL, X, 80, easeOutQuint), 20);
paths_.emplace_back(createPath(Y0, Y1, PathType::VERTICAL, X, 80, easeOutQuint), 0.33f); // 20 frames → segundos
paths_.emplace_back(createPath(Y1, Y2, PathType::VERTICAL, X, 80, easeInQuint), 0);
}
@@ -1046,7 +1046,7 @@ void Game::initPaths() {
const int X1 = param.game.play_area.center_x - (W / 2);
const int X2 = param.game.play_area.rect.w;
const int Y = param.game.play_area.center_y - (H / 2) - 20;
paths_.emplace_back(createPath(X0, X1, PathType::HORIZONTAL, Y, 80, easeOutQuint), 400);
paths_.emplace_back(createPath(X0, X1, PathType::HORIZONTAL, Y, 80, easeOutQuint), 6.67f); // 400 frames → segundos
paths_.emplace_back(createPath(X1, X2, PathType::HORIZONTAL, Y, 80, easeInQuint), 0);
}
@@ -1059,7 +1059,7 @@ void Game::initPaths() {
const int X1 = param.game.play_area.center_x - (W / 2);
const int X2 = -W;
const int Y = param.game.play_area.center_y + (H / 2) - 20;
paths_.emplace_back(createPath(X0, X1, PathType::HORIZONTAL, Y, 80, easeOutQuint), 400);
paths_.emplace_back(createPath(X0, X1, PathType::HORIZONTAL, Y, 80, easeOutQuint), 6.67f); // 400 frames → segundos
paths_.emplace_back(createPath(X1, X2, PathType::HORIZONTAL, Y, 80, easeInQuint), 0);
}
}
@@ -1660,9 +1660,12 @@ void Game::updateDemo() {
fade_in_->update();
fade_out_->update();
// Incrementa el contador de la demo
if (demo_.counter < TOTAL_DEMO_DATA) {
// Incrementa el contador de la demo cada 1/60 segundos (16.67ms)
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
}
// Activa el fundido antes de acabar con los datos de la demo
@@ -1686,9 +1689,13 @@ void Game::updateRecording() {
// Solo mira y guarda el input en cada update
checkInput();
// Incrementa el contador de la demo
if (demo_.counter < TOTAL_DEMO_DATA)
// Incrementa el contador de la demo cada 1/60 segundos (16.67ms)
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
}
// Si se ha llenado el vector con datos, sale del programa
else {
@@ -1740,6 +1747,7 @@ void Game::updateGameStateShowingGetReadyMessage(float deltaTime) {
if (music_timer >= 1.67f) {
playMusic();
music_started = true;
setState(State::PLAYING);
}
}
}