diff --git a/source/core/rendering/screen.cpp b/source/core/rendering/screen.cpp index fa9c8eb..b5825ba 100644 --- a/source/core/rendering/screen.cpp +++ b/source/core/rendering/screen.cpp @@ -90,6 +90,9 @@ Screen::Screen() // Establece la surface que actuará como renderer para recibir las llamadas a render() renderer_surface_ = std::make_shared>(game_surface_); + // Crea el objeto de texto para la pantalla de carga + createText(); + // Extrae el nombre de las paletas desde su ruta processPaletteList(); @@ -574,4 +577,13 @@ auto Screen::initSDLVideo() -> bool { std::cout << "** Video system initialized successfully\n"; return true; +} + +// Crea el objeto de texto +void Screen::createText() { + // Carga la surface de la fuente directamente del archivo + auto surface = std::make_shared(Asset::get()->get("aseprite.gif")); + + // Crea el objeto de texto (el constructor de Text carga el archivo text_file internamente) + text_ = std::make_shared(surface, Asset::get()->get("aseprite.txt")); } \ No newline at end of file diff --git a/source/core/rendering/screen.hpp b/source/core/rendering/screen.hpp index 1f8ce8c..b84da0e 100644 --- a/source/core/rendering/screen.hpp +++ b/source/core/rendering/screen.hpp @@ -9,6 +9,7 @@ #include "utils/utils.hpp" // Para Color class Surface; +class Text; namespace Rendering { class ShaderBackend; } @@ -70,6 +71,7 @@ class Screen { std::shared_ptr border_surface_; // Surface para pintar el el borde de la pantalla std::shared_ptr> renderer_surface_; // Puntero a la Surface que actua std::unique_ptr shader_backend_; // Backend de shaders (OpenGL/Metal/Vulkan) + std::shared_ptr text_; // Objeto para escribir texto en pantalla de carga // Variables int window_width_; // Ancho de la pantalla o ventana @@ -120,6 +122,7 @@ class Screen { void renderInfo(); // Muestra información por pantalla void getDisplayInfo(); // Obtiene información sobre la pantalla auto initSDLVideo() -> bool; // Arranca SDL VIDEO y crea la ventana + void createText(); // Crea el objeto de texto // Constructor Screen(); @@ -212,4 +215,5 @@ class Screen { auto getRenderer() -> SDL_Renderer*; auto getRendererSurface() -> std::shared_ptr; auto getBorderSurface() -> std::shared_ptr; + [[nodiscard]] auto getText() const -> std::shared_ptr { return text_; } }; \ No newline at end of file diff --git a/source/core/resources/resource.cpp b/source/core/resources/resource.cpp index 12a74f7..f167143 100644 --- a/source/core/resources/resource.cpp +++ b/source/core/resources/resource.cpp @@ -15,7 +15,10 @@ #include "external/jail_audio.h" // Para JA_DeleteMusic, JA_DeleteSound, JA_Loa... #include "game/gameplay/room.hpp" // Para RoomData, loadRoomFile, loadRoomTileFile #include "game/options.hpp" // Para Options, OptionsGame, options +#include "game/defaults.hpp" // Para GameDefaults::VERSION +#include "utils/defines.hpp" // Para WINDOW_CAPTION #include "utils/utils.hpp" // Para getFileName, printWithDots, PaletteColor +#include "version.h" // Para Version::GIT_HASH struct JA_Music_t; // lines 17-17 struct JA_Sound_t; // lines 18-18 @@ -32,7 +35,10 @@ void Resource::destroy() { delete Resource::resource; } auto Resource::get() -> Resource* { return Resource::resource; } // Constructor -Resource::Resource() { load(); } +Resource::Resource() { + loading_text_ = Screen::get()->getText(); + load(); +} // Vacia todos los vectores de recursos void Resource::clear() { @@ -408,13 +414,36 @@ void Resource::renderProgress() { Screen::get()->clearSurface(static_cast(PaletteColor::BLACK)); auto surface = Screen::get()->getRendererSurface(); + const Uint8 TEXT_COLOR = static_cast(PaletteColor::WHITE); + const int TEXT_HEIGHT = loading_text_->getCharacterSize(); + const int CENTER_X = Options::game.width / 2; + const int CENTER_Y = Options::game.height / 2; + + // Draw APP_NAME centered above center + const std::string APP_NAME = WINDOW_CAPTION; + loading_text_->writeColored( + CENTER_X - (loading_text_->lenght(APP_NAME) / 2), + CENTER_Y - TEXT_HEIGHT, + APP_NAME, + TEXT_COLOR); + + // Draw VERSION centered below center + const std::string VERSION_TEXT = "(" + std::string(Version::GIT_HASH) + ")"; + loading_text_->writeColored( + CENTER_X - (loading_text_->lenght(VERSION_TEXT) / 2), + CENTER_Y + TEXT_HEIGHT, + VERSION_TEXT, + TEXT_COLOR); + + // Draw progress bar border const float WIRED_BAR_WIDTH = Options::game.width - (X_PADDING * 2); SDL_FRect rect_wired = {X_PADDING, BAR_POSITION, WIRED_BAR_WIDTH, X_PADDING}; - surface->drawRectBorder(&rect_wired, static_cast(PaletteColor::WHITE)); + surface->drawRectBorder(&rect_wired, TEXT_COLOR); + // Draw progress bar fill const float FULL_BAR_WIDTH = WIRED_BAR_WIDTH * count_.getPercentage(); SDL_FRect rect_full = {X_PADDING, BAR_POSITION, FULL_BAR_WIDTH, X_PADDING}; - surface->fillRect(&rect_full, static_cast(PaletteColor::WHITE)); + surface->fillRect(&rect_full, TEXT_COLOR); Screen::get()->render(); } diff --git a/source/core/resources/resource.hpp b/source/core/resources/resource.hpp index 9c9c2eb..c1de45e 100644 --- a/source/core/resources/resource.hpp +++ b/source/core/resources/resource.hpp @@ -152,7 +152,8 @@ class Resource { std::vector tile_maps_; // Vector con los mapas de tiles std::vector rooms_; // Vector con las habitaciones - ResourceCount count_; // Contador de recursos + ResourceCount count_; // Contador de recursos + std::shared_ptr loading_text_; // Texto para la pantalla de carga // Carga los sonidos void loadSounds(); diff --git a/source/game/options.hpp b/source/game/options.hpp index 4edaf24..da13343 100644 --- a/source/game/options.hpp +++ b/source/game/options.hpp @@ -7,6 +7,7 @@ #include #include "core/rendering/screen.hpp" // Para ScreenFilter +#include "utils/defines.hpp" // Para WINDOW_CAPTION #include "utils/utils.hpp" // Para Color, Palette // --- Namespace Options: gestión de configuración y opciones del juego --- @@ -87,16 +88,16 @@ struct Stats { // Estructura con opciones de la ventana struct Window { - std::string caption{"JailDoctor's Dilemma"}; // Texto que aparece en la barra de título de la ventana - int zoom{GameDefaults::WINDOW_ZOOM}; // Zoom de la ventana - int max_zoom{GameDefaults::WINDOW_ZOOM}; // Máximo tamaño de zoom para la ventana + std::string caption{WINDOW_CAPTION}; // Texto que aparece en la barra de título de la ventana + int zoom{GameDefaults::WINDOW_ZOOM}; // Zoom de la ventana + int max_zoom{GameDefaults::WINDOW_ZOOM}; // Máximo tamaño de zoom para la ventana // Constructor por defecto Window() = default; // Constructor Window(int window_zoom, int maximum_zoom) - : caption("JailDoctor's Dilemma"), + : caption(WINDOW_CAPTION), zoom(window_zoom), max_zoom(maximum_zoom) {} }; diff --git a/source/utils/defines.hpp b/source/utils/defines.hpp index e4f53bc..f27f6a6 100644 --- a/source/utils/defines.hpp +++ b/source/utils/defines.hpp @@ -9,7 +9,6 @@ // Textos constexpr const char* WINDOW_CAPTION = "JailDoctor's Dilemma"; constexpr const char* TEXT_COPYRIGHT = "@2022 JailDesigner"; -constexpr const char* VERSION = "1.10"; // Velocidad del juego constexpr Uint32 GAME_SPEED = 15;