LoadingScreen: afegits picos de soroll als silencis

This commit is contained in:
2025-11-02 10:08:39 +01:00
parent 9cd1755266
commit 46f7968faf
2 changed files with 38 additions and 5 deletions

View File

@@ -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;
@@ -446,3 +448,25 @@ 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;
}

View File

@@ -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<int, MONO_TOTAL_LINES> 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
};