càrrega de recursos no bloquejant

This commit is contained in:
2026-04-14 18:10:28 +02:00
parent d493ebf4f0
commit 8706b2c7fb
15 changed files with 356 additions and 118 deletions

View File

@@ -0,0 +1,26 @@
#include "game/scenes/preload.hpp"
#include "core/resources/resource.hpp" // Para Resource
#include "core/system/section.hpp" // Para Section
#include "game/options.hpp" // Para Options::loading
void Preload::iterate() {
// El repintado es independiente del avance de la carga: Director::iterate
// ya ha bombeado Resource::loadStep() antes de llamar aquí.
Resource::get()->renderProgress();
}
void Preload::handleEvent(const SDL_Event& event) {
// Solo aceptamos input si la carga ha terminado y estamos en modo
// wait_for_input (que además exige que la pantalla de carga sea visible).
if (!Resource::get()->isLoadDone() || !Options::loading.wait_for_input || !Options::loading.show) {
return;
}
// Pulsación limpia: ignoramos auto-repeat y eventos de hotplug de mando.
const bool IS_KEY = event.type == SDL_EVENT_KEY_DOWN && !event.key.repeat;
const bool IS_BUTTON = event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN;
if (IS_KEY || IS_BUTTON) {
Section::name = Section::post_preload;
}
}

View File

@@ -0,0 +1,19 @@
#pragma once
#include <SDL3/SDL.h> // Para SDL_Event
// --- Clase Preload: escena mínima durante la carga incremental de recursos ---
//
// No avanza la carga — de eso se encarga Director::iterate() llamando a
// Resource::loadStep(budget_ms) antes de despachar la escena. Aquí solo se
// repinta la barra de progreso y, si Options::loading.wait_for_input está
// activo, se detecta la pulsación que transiciona a la siguiente sección.
class Preload {
public:
Preload() = default;
~Preload() = default;
// --- Callbacks para el bucle SDL_MAIN_USE_CALLBACKS ---
void iterate(); // Repinta la barra de progreso
void handleEvent(const SDL_Event& event); // Detecta pulsación en modo wait_for_input
};