diff --git a/source/tabe.cpp b/source/tabe.cpp index 149d302..e18741c 100644 --- a/source/tabe.cpp +++ b/source/tabe.cpp @@ -1,16 +1,18 @@ // IWYU pragma: no_include #include "tabe.h" #include // Para SDL_FLIP_HORIZONTAL, SDL_FLIP_NONE -#include // Para rand, abs -#include // Para max -#include "jail_audio.h" // Para JA_PlaySound -#include "param.h" // Para Param, ParamGame, param -#include "resource.h" // Para Resource -#include "utils.h" // Para Zone +#include +#include // Para rand, abs +#include // Para max +#include "jail_audio.h" // Para JA_PlaySound +#include "param.h" // Para Param, ParamGame, param +#include "resource.h" // Para Resource +#include "utils.h" // Para Zone // Constructor Tabe::Tabe() - : sprite_(std::make_unique(Resource::get()->getTexture("tabe.png"), Resource::get()->getAnimation("tabe.ani"))) {} + : sprite_(std::make_unique(Resource::get()->getTexture("tabe.png"), Resource::get()->getAnimation("tabe.ani"))), + timer_(TabeTimer(2.5f, 4.0f)) {} // Actualiza la lógica void Tabe::update() @@ -21,6 +23,11 @@ void Tabe::update() move(); updateState(); } + timer_.update(); + if (timer_.should_spawn()) + { + enable(); + } } // Dibuja el objeto @@ -49,7 +56,7 @@ void Tabe::move() { if (x_ < min_x) { - enabled_ = false; + disable(); } if (x_ > param.game.game_area.rect.x + param.game.game_area.rect.w - WIDTH_ && direction_ == TabeDirection::TO_THE_RIGHT) { @@ -63,7 +70,7 @@ void Tabe::move() { if (x_ > max_x) { - enabled_ = false; + disable(); } if (x_ < param.game.game_area.rect.x && direction_ == TabeDirection::TO_THE_LEFT) { @@ -193,10 +200,25 @@ void Tabe::updateState() // Intenta obtener el bonus bool Tabe::tryToGetBonus() { - if (has_bonus_ && rand() % std::max(1, 10 - number_of_hits_) == 0) + if (has_bonus_ && rand() % std::max(1, 15 - number_of_hits_) == 0) { has_bonus_ = false; return true; } return false; } + +// Actualiza el temporizador +void Tabe::updateTimer() +{ + timer_.current_time = SDL_GetTicks(); + timer_.delta_time = timer_.current_time - timer_.last_time; + timer_.last_time = timer_.current_time; +} + +// Deshabilita el objeto +void Tabe::disable() +{ + enabled_ = false; + timer_.reset(); +} \ No newline at end of file diff --git a/source/tabe.h b/source/tabe.h index a8ed9cc..608ebab 100644 --- a/source/tabe.h +++ b/source/tabe.h @@ -1,8 +1,9 @@ #pragma once -#include // Para SDL_Rect -#include // Para unique_ptr -#include "animated_sprite.h" // Para AnimatedSprite +#include // Para SDL_Rect +#include +#include // Para unique_ptr +#include "animated_sprite.h" // Para AnimatedSprite enum class TabeDirection : int { @@ -16,6 +17,55 @@ enum class TabeState : int HIT = 1, }; +struct TabeTimer +{ + Uint32 time_until_next_spawn; // Tiempo restante para la próxima aparición + Uint32 min_spawn_time; // Tiempo mínimo entre apariciones + Uint32 max_spawn_time; // Tiempo máximo entre apariciones + Uint32 current_time; // Tiempo actual + Uint32 delta_time; // Diferencia de tiempo desde la última actualización + Uint32 last_time; // Tiempo de la última actualización + + // Constructor + TabeTimer(float minTime, float maxTime) + : min_spawn_time(minTime * 60000), max_spawn_time(maxTime * 60000) + { + current_time = SDL_GetTicks(); + reset(); + } + + // Restablece el temporizador con un nuevo tiempo hasta la próxima aparición + void reset() + { + Uint32 range = max_spawn_time - min_spawn_time; + time_until_next_spawn = min_spawn_time + rand() % (range + 1); + last_time = SDL_GetTicks(); + } + + // Actualiza el temporizador, decrementando el tiempo hasta la próxima aparición + void update() + { + current_time = SDL_GetTicks(); + delta_time = current_time - last_time; + last_time = current_time; + + if (time_until_next_spawn > delta_time) + { + time_until_next_spawn -= delta_time; + } + else + { + time_until_next_spawn = 0; + } + } + + // Indica si el temporizador ha finalizado + bool should_spawn() const + { + return time_until_next_spawn == 0; + } +}; + // Clase Tabe class Tabe { @@ -41,6 +91,7 @@ private: int hit_counter_ = 0; // Contador para el estado HIT int number_of_hits_ = 0; // Cantidad de disparos que ha recibido bool has_bonus_ = true; // Indica si el Tabe aun tiene el bonus para soltar + TabeTimer timer_; // Temporizador para gestionar la aparición del Tabe // Mueve el objeto void move(); @@ -54,6 +105,12 @@ private: // Actualiza el estado void updateState(); + // Actualiza el temporizador + void updateTimer(); + + // Deshabilita el objeto + void disable(); + public: // Constructor Tabe();