diff --git a/source/game/scenes/loading_screen.cpp b/source/game/scenes/loading_screen.cpp index 21b5cef..35e557f 100644 --- a/source/game/scenes/loading_screen.cpp +++ b/source/game/scenes/loading_screen.cpp @@ -331,12 +331,13 @@ void LoadingScreen::update() { // Actualizar la carga según el estado actual switch (state_) { - case State::SILENT1: case State::DATA1: - case State::SILENT2: case State::DATA2: // Por ahora no hacen nada específico - // Tú definirás la lógica de cada estado aquí + break; + case State::SILENT1: + case State::SILENT2: + updateSilent(DELTA_TIME); break; case State::HEADER1: case State::HEADER2: @@ -429,6 +430,7 @@ void LoadingScreen::printProgramName() { Screen::get()->setRendererSurface(previous_renderer); } +// Actualiza la portadora void LoadingScreen::updateCarrier(float delta_time) { constexpr float CARRIER_BASE_SPEED = -250.0F; constexpr float CARRIER_HEIGHT = HEADER_DATAROW_HEIGHT; @@ -445,4 +447,26 @@ void LoadingScreen::updateCarrier(float delta_time) { } carrier_.total_time += delta_time; +} + +// Actualiza el ruido durante el tiempo de silencio +void LoadingScreen::updateSilent(float delta_time) { + constexpr float NOISE_THRESHOLD = 0.35F; + + // Oscilación compuesta para simular picos de ruido + const float modulation = std::sin(noise_.total_time * 4.2F) * std::sin(noise_.total_time * 1.7F + 0.5F); + noise_.value = std::fabs(modulation); // rango [0.0, 1.0] + + // Detecta cruce de umbral solo si venía de abajo + if (noise_.value > NOISE_THRESHOLD && !noise_.crossed) { + noise_.crossed = true; + current_border_type_ = (current_border_type_ == Border::RED) ? Border::CYAN : Border::RED; + } + + // Restablece el flag cuando baja del umbral + if (noise_.value < NOISE_THRESHOLD) { + noise_.crossed = false; + } + + noise_.total_time += delta_time; } \ No newline at end of file diff --git a/source/game/scenes/loading_screen.hpp b/source/game/scenes/loading_screen.hpp index 4bbc8f1..f730675 100644 --- a/source/game/scenes/loading_screen.hpp +++ b/source/game/scenes/loading_screen.hpp @@ -43,17 +43,24 @@ class LoadingScreen { void run(); private: + // --- Estructuras --- struct Carrier { float offset{0.0F}; // Offset para la carga de cabeceras bool toggle{false}; // Para cambiar el color inicial float total_time{0.0F}; // Tiempo acumulado para modulación de velocidad }; + struct Noise { + float value{0.0F}; // Nivel actual de ruido (0.0 a 1.0) + float total_time{0.0F}; // Tiempo acumulado para modulación + bool crossed{false}; // Flag para detectar cruce de umbral + }; + // --- Constantes de tiempo (en segundos) --- - static constexpr float SILENT1_DURATION = 1.0F; // Pausa inicial + static constexpr float SILENT1_DURATION = 2.0F; // Pausa inicial static constexpr float HEADER1_DURATION = 4.0F; // Cabecera static constexpr float DATA1_DURATION = 0.3F; // Datos - static constexpr float SILENT2_DURATION = 2.0F; // Segunda pausa + static constexpr float SILENT2_DURATION = 3.0F; // Segunda pausa static constexpr float HEADER2_DURATION = 2.0F; // Cabecera pantalla static constexpr float LOADING_MONO_DURATION = 16.0F; // Duración total de la carga monocromática static constexpr float LOADING_COLOR_DURATION = 4.0F; // Duración total de la carga en color @@ -85,6 +92,7 @@ class LoadingScreen { std::array line_index_; // El orden en el que se procesan las 192 líneas de la pantalla de carga SDL_FRect load_rect_{0.0F, 0.0F, 0.0F, 1.0F}; // Rectángulo para dibujar la pantalla de carga Carrier carrier_; // Estructura para los efectos de la carga de cabeceras + Noise noise_; // Variaciones de ruido durante los silencios // --- Funciones --- void update(); // Actualiza las variables @@ -102,4 +110,5 @@ class LoadingScreen { void initLineIndexArray(); // Inicializa el array de índices de líneas void printProgramName(); // Escribe el nombre del programa void updateCarrier(float delta_time); // Actualiza la portadora + void updateSilent(float delta_time); // Actualiza el ruido durante el tiempo de silencio }; \ No newline at end of file