Implementar sistema delta time independiente del framerate

- Migrar de fisica frame-based (60 FPS fijo) a time-based
- Convertir velocidades: x60 multiplicador (pixeles/frame → pixeles/segundo)
- Convertir gravedad: x3600 multiplicador (pixeles/frame² → pixeles/segundo²)
- Añadir calculateDeltaTime() con limitador de saltos grandes
- Actualizar Ball::update() para recibir deltaTime como parametro
- Implementar debug display con valores de fisica en tiempo real
- Documentar proceso completo de migracion en README.md
- Conseguir velocidad consistente entre diferentes refresh rates
- V-Sync independiente: misma velocidad con V-Sync ON/OFF

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-15 09:23:08 +02:00
parent a2959df311
commit 393ad991a7
5 changed files with 204 additions and 51 deletions

View File

@@ -9,35 +9,37 @@ Ball::Ball(float x, float vx, float vy, Color color, std::shared_ptr<Texture> te
: sprite_(std::make_unique<Sprite>(texture)),
pos_({x, 0.0f, BALL_SIZE, BALL_SIZE})
{
vx_ = vx;
vy_ = vy;
// Convertir velocidades de píxeles/frame a píxeles/segundo (multiplicar por 60)
vx_ = vx * 60.0f;
vy_ = vy * 60.0f;
sprite_->setPos({pos_.x, pos_.y});
sprite_->setSize(BALL_SIZE, BALL_SIZE);
sprite_->setClip({0, 0, BALL_SIZE, BALL_SIZE});
color_ = color;
gravity_force_ = GRAVITY_FORCE;
// Convertir gravedad de píxeles/frame² a píxeles/segundo² (multiplicar por 60²)
gravity_force_ = GRAVITY_FORCE * 60.0f * 60.0f;
on_floor_ = false;
stopped_ = false;
loss_ = ((rand() % 30) * 0.01f) + 0.6f;
}
// Actualiza la lógica de la clase
void Ball::update()
void Ball::update(float deltaTime)
{
if (stopped_)
{
return;
}
// Aplica la gravedad a la velocidad
if (!on_floor_ && (pos_.y - SCREEN_HEIGHT) < BALL_SIZE * 2)
// Aplica la gravedad a la velocidad (píxeles/segundo²)
if (!on_floor_)
{
vy_ += gravity_force_;
vy_ += gravity_force_ * deltaTime;
}
// Actualiza la posición en función de la velocidad
pos_.x += vx_;
pos_.y += vy_;
// Actualiza la posición en función de la velocidad (píxeles/segundo)
pos_.x += vx_ * deltaTime;
pos_.y += vy_ * deltaTime;
// Comprueba las colisiones con el lateral izquierdo
if (pos_.x < 0)
@@ -94,20 +96,20 @@ void Ball::render()
sprite_->render();
}
// Modifica la velocidad
// Modifica la velocidad (convierte de frame-based a time-based)
void Ball::modVel(float vx, float vy)
{
if (stopped_)
{
vx_ = vx_ + vx;
vx_ = vx_ + (vx * 60.0f); // Convertir a píxeles/segundo
}
vy_ = vy_ + vy;
vy_ = vy_ + (vy * 60.0f); // Convertir a píxeles/segundo
on_floor_ = false;
stopped_ = false;
}
// Cambia la gravedad
// Cambia la gravedad (usa la versión convertida)
void Ball::switchGravity()
{
gravity_force_ = gravity_force_ == 0.0f ? GRAVITY_FORCE : 0.0f;
gravity_force_ = gravity_force_ == 0.0f ? (GRAVITY_FORCE * 60.0f * 60.0f) : 0.0f;
}