From 26e0fd7247bb336502aead1bad7f89e389c9a3a6 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 16 Sep 2025 16:37:39 +0200 Subject: [PATCH] delta-time: moving_sprite.cpp --- source/moving_sprite.cpp | 33 ++++++++++++++++++++++++++++++--- source/moving_sprite.h | 15 +++++++++------ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/source/moving_sprite.cpp b/source/moving_sprite.cpp index bcca476..76cc63f 100644 --- a/source/moving_sprite.cpp +++ b/source/moving_sprite.cpp @@ -53,7 +53,7 @@ void MovingSprite::stop() { flip_ = SDL_FLIP_NONE; // Establece como se ha de voltear el sprite } -// Mueve el sprite +// Mueve el sprite (frame-based) void MovingSprite::move() { x_ += vx_; y_ += vy_; @@ -65,16 +65,34 @@ void MovingSprite::move() { pos_.y = static_cast(y_); } -// Actualiza las variables internas del objeto +// Mueve el sprite (time-based) +void MovingSprite::move(float deltaTime) { + x_ += vx_ * deltaTime; + y_ += vy_ * deltaTime; + + vx_ += ax_ * deltaTime; + vy_ += ay_ * deltaTime; + + pos_.x = static_cast(x_); + pos_.y = static_cast(y_); +} + +// Actualiza las variables internas del objeto (frame-based) void MovingSprite::update() { move(); rotate(); } +// Actualiza las variables internas del objeto (time-based) +void MovingSprite::update(float deltaTime) { + move(deltaTime); + rotate(deltaTime); +} + // Muestra el sprite por pantalla void MovingSprite::render() { getTexture()->render(pos_.x, pos_.y, &sprite_clip_, horizontal_zoom_, vertical_zoom_, rotate_.angle, &rotate_.center, flip_); } -// Establece la rotacion +// Establece la rotacion (frame-based) void MovingSprite::rotate() { if (rotate_.enabled) { ++rotate_.counter; @@ -85,6 +103,15 @@ void MovingSprite::rotate() { } } +// Establece la rotacion (time-based) +void MovingSprite::rotate(float deltaTime) { + if (rotate_.enabled) { + // Convertir speed (frames) a tiempo: speed frames = speed/60 segundos a 60fps + float rotationSpeed = static_cast(rotate_.speed) / 60.0f; + rotate_.angle += rotate_.amount * (deltaTime / rotationSpeed); + } +} + // Activa o desactiva el efecto de rotación void MovingSprite::setRotate(bool enable) { rotate_.enabled = enable; diff --git a/source/moving_sprite.h b/source/moving_sprite.h index 124b839..cc5593a 100644 --- a/source/moving_sprite.h +++ b/source/moving_sprite.h @@ -29,10 +29,11 @@ class MovingSprite : public Sprite { ~MovingSprite() override = default; // --- Métodos principales --- - virtual void update(); // Actualiza las variables internas del objeto - void clear() override; // Reinicia todas las variables a cero - void stop(); // Elimina el movimiento del sprite - void render() override; // Muestra el sprite por pantalla + virtual void update(); // Actualiza las variables internas del objeto (frame-based) + virtual void update(float deltaTime); // Actualiza las variables internas del objeto (time-based) + void clear() override; // Reinicia todas las variables a cero + void stop(); // Elimina el movimiento del sprite + void render() override; // Muestra el sprite por pantalla // --- Configuración --- void setPos(SDL_FRect rect); // Establece la posición y el tamaño del objeto @@ -79,6 +80,8 @@ class MovingSprite : public Sprite { // --- Métodos internos --- void updateAngle() { rotate_.angle += rotate_.amount; } // Incrementa el valor del ángulo - void move(); // Mueve el sprite según velocidad y aceleración - void rotate(); // Rota el sprite según los parámetros de rotación + void move(); // Mueve el sprite según velocidad y aceleración (frame-based) + void move(float deltaTime); // Mueve el sprite según velocidad y aceleración (time-based) + void rotate(); // Rota el sprite según los parámetros de rotación (frame-based) + void rotate(float deltaTime); // Rota el sprite según los parámetros de rotación (time-based) }; \ No newline at end of file