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:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user