diff --git a/source/ball.h b/source/ball.h index 2aac468..4dbf0a2 100644 --- a/source/ball.h +++ b/source/ball.h @@ -55,6 +55,7 @@ class Ball { float getLossCoefficient() const { return loss_; } GravityDirection getGravityDirection() const { return gravity_direction_; } bool isOnSurface() const { return on_surface_; } + bool isStopped() const { return stopped_; } // Getters para batch rendering SDL_FRect getPosition() const { return pos_; } diff --git a/source/engine.cpp b/source/engine.cpp index e59d40a..1c1382d 100644 --- a/source/engine.cpp +++ b/source/engine.cpp @@ -147,6 +147,9 @@ void Engine::update() { if (show_text_) { show_text_ = !(SDL_GetTicks() - text_init_time_ > TEXT_DURATION); } + + // Verificar auto-reinicio cuando todas las pelotas están quietas + checkAutoRestart(); } void Engine::handleEvents() { @@ -769,4 +772,48 @@ void Engine::initializeThemes() { {255, 0, 64} // 345° - Magenta claro-Rojo } }; +} + +void Engine::checkAutoRestart() { + // Verificar si TODAS las pelotas están paradas + bool all_stopped = true; + for (const auto &ball : balls_) { + if (!ball->isStopped()) { + all_stopped = false; + break; + } + } + + if (all_stopped) { + if (!all_balls_were_stopped_) { + // Primera vez que se detecta que todas están paradas + all_balls_stopped_start_time_ = SDL_GetTicks(); + all_balls_were_stopped_ = true; + } else { + // Ya estaban paradas, verificar tiempo transcurrido + Uint64 current_time = SDL_GetTicks(); + if (current_time - all_balls_stopped_start_time_ >= AUTO_RESTART_DELAY) { + performRandomRestart(); + } + } + } else { + // Al menos una pelota se está moviendo - resetear temporizador + all_balls_were_stopped_ = false; + all_balls_stopped_start_time_ = 0; + } +} + +void Engine::performRandomRestart() { + // Escenario aleatorio usando tamaño del array + scenario_ = rand() % test_.size(); + + // Tema aleatorio usando tamaño del array de temas + current_theme_ = static_cast(rand() % (sizeof(themes_) / sizeof(themes_[0]))); + + // Reinicializar pelotas con nuevo escenario y tema + initBalls(scenario_); + + // Resetear temporizador + all_balls_were_stopped_ = false; + all_balls_stopped_start_time_ = 0; } \ No newline at end of file diff --git a/source/engine.h b/source/engine.h index f893729..4281469 100644 --- a/source/engine.h +++ b/source/engine.h @@ -58,6 +58,11 @@ private: bool fullscreen_enabled_ = false; bool real_fullscreen_enabled_ = false; + // Auto-restart system + Uint64 all_balls_stopped_start_time_ = 0; // Momento cuando todas se pararon + bool all_balls_were_stopped_ = false; // Flag de estado anterior + static constexpr Uint64 AUTO_RESTART_DELAY = 5000; // 5 segundos en ms + // Resolución dinámica para modo real fullscreen int current_screen_width_ = SCREEN_WIDTH; int current_screen_height_ = SCREEN_HEIGHT; @@ -96,6 +101,8 @@ private: void toggleRealFullscreen(); std::string gravityDirectionToString(GravityDirection direction) const; void initializeThemes(); + void checkAutoRestart(); + void performRandomRestart(); // Sistema de zoom dinámico int calculateMaxWindowZoom() const;