diff --git a/source/bullet.cpp b/source/bullet.cpp index 174293c..3d36cf5 100644 --- a/source/bullet.cpp +++ b/source/bullet.cpp @@ -60,13 +60,19 @@ void Bullet::render() { } } -// Actualiza el estado del objeto +// Actualiza el estado del objeto (frame-based) auto Bullet::update() -> BulletMoveStatus { sprite_->update(); return move(); } -// Implementación del movimiento usando BulletMoveStatus +// Actualiza el estado del objeto (time-based) +auto Bullet::update(float deltaTime) -> BulletMoveStatus { + sprite_->update(deltaTime); + return move(deltaTime); +} + +// Implementación del movimiento usando BulletMoveStatus (frame-based) auto Bullet::move() -> BulletMoveStatus { pos_x_ += vel_x_; if (pos_x_ < param.game.play_area.rect.x - WIDTH || pos_x_ > param.game.play_area.rect.w) { @@ -86,6 +92,29 @@ auto Bullet::move() -> BulletMoveStatus { return BulletMoveStatus::OK; } +// Implementación del movimiento usando BulletMoveStatus (time-based) +auto Bullet::move(float deltaTime) -> BulletMoveStatus { + // Convertir deltaTime (milisegundos) a factor de frame (asumiendo 60fps) + float frameFactor = deltaTime / (1000.0f / 60.0f); + + pos_x_ += vel_x_ * frameFactor; + if (pos_x_ < param.game.play_area.rect.x - WIDTH || pos_x_ > param.game.play_area.rect.w) { + disable(); + return BulletMoveStatus::OUT; + } + + pos_y_ += VEL_Y * frameFactor; + if (pos_y_ < param.game.play_area.rect.y - HEIGHT) { + disable(); + return BulletMoveStatus::OUT; + } + + shiftSprite(); + shiftColliders(); + + return BulletMoveStatus::OK; +} + auto Bullet::isEnabled() const -> bool { return bullet_type_ != BulletType::NONE; } diff --git a/source/bullet.h b/source/bullet.h index 221c016..c6fd9ee 100644 --- a/source/bullet.h +++ b/source/bullet.h @@ -34,9 +34,10 @@ class Bullet { ~Bullet() = default; // Destructor // --- Métodos principales --- - void render(); // Dibuja la bala en pantalla - auto update() -> BulletMoveStatus; // Actualiza el estado del objeto - void disable(); // Desactiva la bala + void render(); // Dibuja la bala en pantalla + auto update() -> BulletMoveStatus; // Actualiza el estado del objeto (frame-based) + auto update(float deltaTime) -> BulletMoveStatus; // Actualiza el estado del objeto (time-based) + void disable(); // Desactiva la bala // --- Getters --- [[nodiscard]] auto isEnabled() const -> bool; // Comprueba si está activa @@ -64,7 +65,8 @@ class Bullet { // --- Métodos internos --- void shiftColliders(); // Ajusta el círculo de colisión void shiftSprite(); // Ajusta el sprite - auto move() -> BulletMoveStatus; // Mueve la bala y devuelve su estado + auto move() -> BulletMoveStatus; // Mueve la bala y devuelve su estado (frame-based) + auto move(float deltaTime) -> BulletMoveStatus; // Mueve la bala y devuelve su estado (time-based) static auto calculateVelocity(BulletType bullet_type) -> float; // Calcula la velocidad horizontal de la bala static auto buildAnimationString(BulletType bullet_type, bool powered) -> std::string; // Construye el string de animación };