singletons

This commit is contained in:
2026-04-17 21:27:30 +02:00
parent 5889df2a47
commit 513eacf356
27 changed files with 536 additions and 505 deletions

View File

@@ -25,13 +25,9 @@
#include "game/ui/menu.h" // for Menu
// Constructor
Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset, Lang *lang, section_t *section) {
Title::Title(SDL_Renderer *renderer, section_t *section) {
// Copia las direcciones de los punteros
this->renderer = renderer;
this->screen = screen;
this->input = input;
this->asset = asset;
this->lang = lang;
this->section = section;
// Reserva memoria para los punteros
@@ -136,7 +132,7 @@ void Title::init() {
deviceIndex.push_back(0); // El primer mando encontrado. Si no ha encontrado ninguno es el teclado
// Si ha encontrado un mando se lo asigna al segundo jugador
if (input->gameControllerFound()) {
if (Input::get()->gameControllerFound()) {
Options::inputs[1].id = availableInputDevices[deviceIndex[1]].id;
Options::inputs[1].name = availableInputDevices[deviceIndex[1]].name;
Options::inputs[1].deviceType = availableInputDevices[deviceIndex[1]].deviceType;
@@ -241,10 +237,10 @@ void Title::update() {
// que Screen::blit() presente por la ruta activa (GPU o
// SDL_Renderer). Un `SDL_RenderPresent(renderer)` directe
// crasheja quan el SDL3 GPU ha reclamat la ventana.
screen->start();
Screen::get()->start();
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(renderer);
screen->blit();
Screen::get()->blit();
// Reproduce el efecto sonoro
JA_PlaySound(crashSound);
@@ -513,10 +509,10 @@ void Title::render() {
// Sección 1 - Titulo desplazandose
case SUBSECTION_TITLE_1: {
// Prepara para empezar a dibujar en la textura de juego
screen->start();
Screen::get()->start();
// Limpia la pantalla
screen->clean(bgColor);
Screen::get()->clean(bgColor);
// Dibuja el tileado de fondo
{
@@ -532,16 +528,16 @@ void Title::render() {
crisisBitmap->render();
// Vuelca el contenido del renderizador en pantalla
screen->blit();
Screen::get()->blit();
} break;
// Sección 2 - Titulo vibrando
case SUBSECTION_TITLE_2: {
// Prepara para empezar a dibujar en la textura de juego
screen->start();
Screen::get()->start();
// Limpia la pantalla
screen->clean(bgColor);
Screen::get()->clean(bgColor);
// Dibuja el tileado de fondo
{
@@ -560,15 +556,15 @@ void Title::render() {
dustBitmapL->render();
// Vuelca el contenido del renderizador en pantalla
screen->blit();
Screen::get()->blit();
} break;
// Sección 3 - La pantalla de titulo con el menú y la música
case SUBSECTION_TITLE_3: { // Prepara para empezar a dibujar en la textura de juego
screen->start();
Screen::get()->start();
// Limpia la pantalla
screen->clean(bgColor);
Screen::get()->clean(bgColor);
// Dibuja el tileado de fondo
{
@@ -598,14 +594,14 @@ void Title::render() {
// PRESS ANY KEY!
if ((counter % 50 > 14) && (menuVisible == false)) {
text1->writeDX(TXT_CENTER | TXT_SHADOW, GAMECANVAS_CENTER_X, PLAY_AREA_THIRD_QUARTER_Y + BLOCK, lang->getText(23), 1, noColor, 1, shdwTxtColor);
text1->writeDX(TXT_CENTER | TXT_SHADOW, GAMECANVAS_CENTER_X, PLAY_AREA_THIRD_QUARTER_Y + BLOCK, Lang::get()->getText(23), 1, noColor, 1, shdwTxtColor);
}
// Fade
fade->render();
// Vuelca el contenido del renderizador en pantalla
screen->blit();
Screen::get()->blit();
} break;
default:
@@ -642,12 +638,12 @@ void Title::checkEvents() {
// Comprueba las entradas
void Title::checkInput() {
#ifndef __EMSCRIPTEN__
if (input->checkInput(input_exit, REPEAT_FALSE)) {
if (Input::get()->checkInput(input_exit, REPEAT_FALSE)) {
section->name = SECTION_PROG_QUIT;
return;
}
#endif
GlobalInputs::handle(screen, input);
GlobalInputs::handle();
}
// Actualiza el tileado de fondo
@@ -673,37 +669,37 @@ void Title::updateMenuLabels() {
// DIFFICULTY
switch (Options::settings.difficulty) {
case DIFFICULTY_EASY:
menu.options->setItemCaption(i, lang->getText(59) + ": " + lang->getText(66)); // EASY
menu.options->setItemCaption(i, Lang::get()->getText(59) + ": " + Lang::get()->getText(66)); // EASY
break;
case DIFFICULTY_NORMAL:
menu.options->setItemCaption(i, lang->getText(59) + ": " + lang->getText(67)); // NORMAL
menu.options->setItemCaption(i, Lang::get()->getText(59) + ": " + Lang::get()->getText(67)); // NORMAL
break;
case DIFFICULTY_HARD:
menu.options->setItemCaption(i, lang->getText(59) + ": " + lang->getText(68)); // HARD
menu.options->setItemCaption(i, Lang::get()->getText(59) + ": " + Lang::get()->getText(68)); // HARD
break;
default:
menu.options->setItemCaption(i, lang->getText(59) + ": " + lang->getText(67)); // NORMAL
menu.options->setItemCaption(i, Lang::get()->getText(59) + ": " + Lang::get()->getText(67)); // NORMAL
break;
}
i++;
// PLAYER 1 CONTROLS
menu.options->setItemCaption(i, lang->getText(62));
menu.options->setItemCaption(i, Lang::get()->getText(62));
i++;
// PLAYER 1 CONTROLS - OPTIONS
switch (Options::inputs[0].deviceType) {
case INPUT_USE_KEYBOARD:
menu.options->setItemCaption(i, lang->getText(69)); // KEYBOARD
menu.options->setItemCaption(i, Lang::get()->getText(69)); // KEYBOARD
menu.options->setGreyed(i, false);
break;
case INPUT_USE_GAMECONTROLLER:
menu.options->setItemCaption(i, lang->getText(70)); // GAME CONTROLLER
if (!input->gameControllerFound())
menu.options->setItemCaption(i, Lang::get()->getText(70)); // GAME CONTROLLER
if (!Input::get()->gameControllerFound())
menu.options->setGreyed(i, true);
else {
menu.options->setGreyed(i, false);
@@ -712,25 +708,25 @@ void Title::updateMenuLabels() {
break;
default:
menu.options->setItemCaption(i, lang->getText(69)); // KEYBOARD
menu.options->setItemCaption(i, Lang::get()->getText(69)); // KEYBOARD
break;
}
i++;
// PLAYER 2 CONTROLS
menu.options->setItemCaption(i, lang->getText(63));
menu.options->setItemCaption(i, Lang::get()->getText(63));
i++;
// PLAYER 2 CONTROLS - OPTIONS
switch (Options::inputs[1].deviceType) {
case INPUT_USE_KEYBOARD:
menu.options->setItemCaption(i, lang->getText(69)); // KEYBOARD
menu.options->setItemCaption(i, Lang::get()->getText(69)); // KEYBOARD
menu.options->setGreyed(i, false);
break;
case INPUT_USE_GAMECONTROLLER:
menu.options->setItemCaption(i, lang->getText(70)); // GAME CONTROLLER
if (!input->gameControllerFound())
menu.options->setItemCaption(i, Lang::get()->getText(70)); // GAME CONTROLLER
if (!Input::get()->gameControllerFound())
menu.options->setGreyed(i, true);
else {
menu.options->setGreyed(i, false);
@@ -739,7 +735,7 @@ void Title::updateMenuLabels() {
break;
default:
menu.options->setItemCaption(i, lang->getText(69)); // KEYBOARD
menu.options->setItemCaption(i, Lang::get()->getText(69)); // KEYBOARD
break;
}
@@ -747,59 +743,59 @@ void Title::updateMenuLabels() {
// LANGUAGE
switch (Options::settings.language) {
case es_ES:
menu.options->setItemCaption(i, lang->getText(8) + ": " + lang->getText(24)); // SPANISH
menu.options->setItemCaption(i, Lang::get()->getText(8) + ": " + Lang::get()->getText(24)); // SPANISH
break;
case ba_BA:
menu.options->setItemCaption(i, lang->getText(8) + ": " + lang->getText(25)); // VALENCIAN
menu.options->setItemCaption(i, Lang::get()->getText(8) + ": " + Lang::get()->getText(25)); // VALENCIAN
break;
case en_UK:
menu.options->setItemCaption(i, lang->getText(8) + ": " + lang->getText(26)); // ENGLISH
menu.options->setItemCaption(i, Lang::get()->getText(8) + ": " + Lang::get()->getText(26)); // ENGLISH
break;
default:
menu.options->setItemCaption(i, lang->getText(8) + ": " + lang->getText(26)); // ENGLISH
menu.options->setItemCaption(i, Lang::get()->getText(8) + ": " + Lang::get()->getText(26)); // ENGLISH
break;
}
i++;
// DISPLAY MODE
menu.options->setItemCaption(i, lang->getText(58));
menu.options->setItemCaption(i, Lang::get()->getText(58));
i++;
// DISPLAY MODE - OPTIONS
menu.options->setItemCaption(i, Options::video.fullscreen ? lang->getText(5) : lang->getText(4));
menu.options->setItemCaption(i, Options::video.fullscreen ? Lang::get()->getText(5) : Lang::get()->getText(4));
i++;
// WINDOW SIZE
menu.options->setItemCaption(i, lang->getText(7) + " x" + std::to_string(Options::window.zoom)); // WINDOW SIZE
menu.options->setItemCaption(i, Lang::get()->getText(7) + " x" + std::to_string(Options::window.zoom)); // WINDOW SIZE
i++;
// SCALE MODE
if (Options::video.scale_mode == SDL_SCALEMODE_LINEAR)
menu.options->setItemCaption(i, lang->getText(60) + ": " + lang->getText(71)); // BILINEAL
menu.options->setItemCaption(i, Lang::get()->getText(60) + ": " + Lang::get()->getText(71)); // BILINEAL
else
menu.options->setItemCaption(i, lang->getText(60) + ": " + lang->getText(72)); // LINEAL
menu.options->setItemCaption(i, Lang::get()->getText(60) + ": " + Lang::get()->getText(72)); // LINEAL
i++;
// VSYNC
if (Options::video.vsync)
menu.options->setItemCaption(i, lang->getText(61) + ": " + lang->getText(73)); // ON
menu.options->setItemCaption(i, Lang::get()->getText(61) + ": " + Lang::get()->getText(73)); // ON
else
menu.options->setItemCaption(i, lang->getText(61) + ": " + lang->getText(74)); // OFF
menu.options->setItemCaption(i, Lang::get()->getText(61) + ": " + Lang::get()->getText(74)); // OFF
i++;
// HOW TO PLAY
menu.options->setItemCaption(i, lang->getText(2));
menu.options->setItemCaption(i, Lang::get()->getText(2));
i++;
// ACCEPT
menu.options->setItemCaption(i, lang->getText(9)); // ACCEPT
menu.options->setItemCaption(i, Lang::get()->getText(9)); // ACCEPT
i++;
// CANCEL
menu.options->setItemCaption(i, lang->getText(10)); // CANCEL
menu.options->setItemCaption(i, Lang::get()->getText(10)); // CANCEL
// Recoloca el menu de opciones
menu.options->centerMenuOnX(GAMECANVAS_CENTER_X);
@@ -808,13 +804,13 @@ void Title::updateMenuLabels() {
// Establece las etiquetas del menu de titulo
#ifdef GAME_CONSOLE
menu.title->setItemCaption(0, lang->getText(0)); // PLAY
menu.title->setItemCaption(0, Lang::get()->getText(0)); // PLAY
#else
menu.title->setItemCaption(0, lang->getText(51)); // 1 PLAYER
menu.title->setItemCaption(0, Lang::get()->getText(51)); // 1 PLAYER
#endif
menu.title->setItemCaption(1, lang->getText(52)); // 2 PLAYERS
menu.title->setItemCaption(2, lang->getText(1)); // OPTIONS
menu.title->setItemCaption(3, lang->getText(3)); // QUIT
menu.title->setItemCaption(1, Lang::get()->getText(52)); // 2 PLAYERS
menu.title->setItemCaption(2, Lang::get()->getText(1)); // OPTIONS
menu.title->setItemCaption(3, Lang::get()->getText(3)); // QUIT
#ifdef __EMSCRIPTEN__
menu.title->setVisible(3, false);
menu.title->setSelectable(3, false);
@@ -825,8 +821,8 @@ void Title::updateMenuLabels() {
menu.title->centerMenuElementsOnX();
// Establece las etiquetas del menu de seleccion de jugador
menu.playerSelect->setItemCaption(0, lang->getText(39)); // SELECT PLAYER
menu.playerSelect->setItemCaption(3, lang->getText(40)); // BACK
menu.playerSelect->setItemCaption(0, Lang::get()->getText(39)); // SELECT PLAYER
menu.playerSelect->setItemCaption(3, Lang::get()->getText(40)); // BACK
// Recoloca el menu de selección de jugador
menu.playerSelect->centerMenuOnX(GAMECANVAS_CENTER_X);
@@ -846,11 +842,11 @@ void Title::updateMenuLabels() {
// Aplica las opciones de menu seleccionadas
void Title::applyOptions() {
screen->setVideoMode(Options::video.fullscreen);
screen->setWindowZoom(Options::window.zoom);
screen->setVSync(Options::video.vsync);
Screen::get()->setVideoMode(Options::video.fullscreen);
Screen::get()->setWindowZoom(Options::window.zoom);
Screen::get()->setVSync(Options::video.vsync);
lang->setLang(Options::settings.language);
Lang::get()->setLang(Options::settings.language);
updateMenuLabels();
createTiledBackground();
@@ -954,7 +950,7 @@ void Title::run() {
// Inicia la parte donde se muestran las instrucciones
void Title::runInstructions(mode_e mode) {
instructions = new Instructions(renderer, screen, asset, input, lang, section);
instructions = new Instructions(renderer, section);
instructions->start(mode);
instructionsActive = true;
instructionsMode = mode;
@@ -965,7 +961,7 @@ void Title::runDemoGame() {
// Temporalmente ponemos section para que el constructor de Game funcione
section->name = SECTION_PROG_GAME;
section->subsection = SUBSECTION_GAME_PLAY_1P;
demoGame = new Game(1, 0, renderer, screen, asset, lang, input, true, section);
demoGame = new Game(1, 0, renderer, true, section);
demoGameActive = true;
// Restauramos section para que Director no transicione fuera de Title
section->name = SECTION_PROG_TITLE;
@@ -975,7 +971,7 @@ void Title::runDemoGame() {
bool Title::updatePlayerInputs(int numPlayer) {
const int numDevices = availableInputDevices.size();
if (!input->gameControllerFound()) { // Si no hay mandos se deja todo de manera prefijada
if (!Input::get()->gameControllerFound()) { // Si no hay mandos se deja todo de manera prefijada
deviceIndex[0] = 0;
deviceIndex[1] = 0;
@@ -1035,7 +1031,7 @@ void Title::createTiledBackground() {
}
// Crea los objetos para pintar en la textura de fondo
Texture *bgTileTexture = new Texture(renderer, asset->get("title_bg_tile.png"));
Texture *bgTileTexture = new Texture(renderer, Asset::get()->get("title_bg_tile.png"));
Sprite *tile = new Sprite({0, 0, 64, 64}, bgTileTexture, renderer);
// Prepara para dibujar sobre la textura
@@ -1069,7 +1065,7 @@ void Title::checkInputDevices() {
if (Options::settings.console) {
std::cout << "Filling devices for options menu..." << std::endl;
}
const int numControllers = input->getNumControllers();
const int numControllers = Input::get()->getNumControllers();
availableInputDevices.clear();
input_t temp;
@@ -1077,7 +1073,7 @@ void Title::checkInputDevices() {
if (numControllers > 0)
for (int i = 0; i < numControllers; ++i) {
temp.id = i;
temp.name = input->getControllerName(i);
temp.name = Input::get()->getControllerName(i);
temp.deviceType = INPUT_USE_GAMECONTROLLER;
availableInputDevices.push_back(temp);
if (Options::settings.console) {