càrrega de recursos no bloquejant
This commit is contained in:
@@ -495,6 +495,7 @@ namespace Options {
|
||||
const auto& ld = yaml["loading"];
|
||||
parseBoolField(ld, "show", loading.show);
|
||||
parseBoolField(ld, "show_resource_name", loading.show_resource_name);
|
||||
parseBoolField(ld, "wait_for_input", loading.wait_for_input);
|
||||
}
|
||||
|
||||
void loadGameFromYaml(const fkyaml::node& yaml) {
|
||||
@@ -696,6 +697,7 @@ namespace Options {
|
||||
file << "loading:\n";
|
||||
file << " show: " << boolToString(loading.show) << "\n";
|
||||
file << " show_resource_name: " << boolToString(loading.show_resource_name) << "\n";
|
||||
file << " wait_for_input: " << boolToString(loading.wait_for_input) << "\n";
|
||||
file << "\n";
|
||||
|
||||
// GAME
|
||||
|
||||
@@ -112,6 +112,7 @@ namespace Options {
|
||||
struct Loading {
|
||||
bool show = Defaults::Loading::SHOW; // Muestra la pantalla de carga (si no, pantalla en negro)
|
||||
bool show_resource_name = Defaults::Loading::SHOW_RESOURCE_NAME; // Muestra el nombre del recurso en curso sobre la barra de progreso
|
||||
bool wait_for_input = Defaults::Loading::WAIT_FOR_INPUT; // Al terminar la carga, espera a que el usuario pulse una tecla/botón (solo si show=true)
|
||||
};
|
||||
|
||||
struct Settings {
|
||||
|
||||
26
source/game/scenes/preload.cpp
Normal file
26
source/game/scenes/preload.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
19
source/game/scenes/preload.hpp
Normal file
19
source/game/scenes/preload.hpp
Normal 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
|
||||
};
|
||||
Reference in New Issue
Block a user