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

@@ -30,13 +30,9 @@
struct JA_Sound_t;
// Constructor
Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang, Input *input, bool demo, section_t *section) {
Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, bool demo, section_t *section) {
// Copia los punteros
this->renderer = renderer;
this->screen = screen;
this->asset = asset;
this->lang = lang;
this->input = input;
this->section = section;
// Pasa variables
@@ -404,15 +400,15 @@ void Game::loadMedia() {
// Menus
gameOverMenu = R->getMenu("gameover");
gameOverMenu->setItemCaption(0, lang->getText(48));
gameOverMenu->setItemCaption(1, lang->getText(49));
const int w = text->getCharacterSize() * lang->getText(45).length();
gameOverMenu->setItemCaption(0, Lang::get()->getText(48));
gameOverMenu->setItemCaption(1, Lang::get()->getText(49));
const int w = text->getCharacterSize() * Lang::get()->getText(45).length();
gameOverMenu->setRectSize(w, 0);
gameOverMenu->centerMenuOnX(199);
pauseMenu = R->getMenu("pause");
pauseMenu->setItemCaption(0, lang->getText(41));
pauseMenu->setItemCaption(1, lang->getText(46));
pauseMenu->setItemCaption(2, lang->getText(47));
pauseMenu->setItemCaption(0, Lang::get()->getText(41));
pauseMenu->setItemCaption(1, Lang::get()->getText(46));
pauseMenu->setItemCaption(2, Lang::get()->getText(47));
// Sonidos
balloonSound = R->getSound("balloon.wav");
@@ -444,7 +440,7 @@ void Game::loadMedia() {
bool Game::loadScoreFile() {
// Indicador de éxito en la carga
bool success = true;
const std::string p = asset->get("score.bin");
const std::string p = Asset::get()->get("score.bin");
const std::string filename = p.substr(p.find_last_of("\\/") + 1);
SDL_IOStream *file = SDL_IOFromFile(p.c_str(), "r+b");
@@ -536,7 +532,7 @@ bool Game::loadDemoFile() {
// Guarda el fichero de puntos
bool Game::saveScoreFile() {
bool success = true;
const std::string p = asset->get("score.bin");
const std::string p = Asset::get()->get("score.bin");
const std::string filename = p.substr(p.find_last_of("\\/") + 1);
SDL_IOStream *file = SDL_IOFromFile(p.c_str(), "w+b");
if (file != nullptr) {
@@ -562,7 +558,7 @@ bool Game::saveScoreFile() {
// Guarda el fichero de datos para la demo
bool Game::saveDemoFile() {
bool success = true;
const std::string p = asset->get("demo.bin");
const std::string p = Asset::get()->get("demo.bin");
const std::string filename = p.substr(p.find_last_of("\\/") + 1);
if (demo.recording) {
SDL_IOStream *file = SDL_IOFromFile(p.c_str(), "w+b");
@@ -1375,33 +1371,33 @@ void Game::renderScoreBoard() {
const int offsetRight = PLAY_AREA_RIGHT - 45;
// PLAYER1 - SCORE
textScoreBoard->writeCentered(offsetLeft, offset1, lang->getText(53));
textScoreBoard->writeCentered(offsetLeft, offset1, Lang::get()->getText(53));
textScoreBoard->writeCentered(offsetLeft, offset2, updateScoreText(players[0]->getScore()));
// PLAYER1 - MULT
textScoreBoard->writeCentered(offsetLeft, offset3, lang->getText(55));
textScoreBoard->writeCentered(offsetLeft, offset3, Lang::get()->getText(55));
textScoreBoard->writeCentered(offsetLeft, offset4, std::to_string(players[0]->getScoreMultiplier()).substr(0, 3));
if (numPlayers == 2) {
// PLAYER2 - SCORE
textScoreBoard->writeCentered(offsetRight, offset1, lang->getText(54));
textScoreBoard->writeCentered(offsetRight, offset1, Lang::get()->getText(54));
textScoreBoard->writeCentered(offsetRight, offset2, updateScoreText(players[1]->getScore()));
// PLAYER2 - MULT
textScoreBoard->writeCentered(offsetRight, offset3, lang->getText(55));
textScoreBoard->writeCentered(offsetRight, offset3, Lang::get()->getText(55));
textScoreBoard->writeCentered(offsetRight, offset4, std::to_string(players[1]->getScoreMultiplier()).substr(0, 3));
} else {
// PLAYER2 - SCORE
textScoreBoard->writeCentered(offsetRight, offset1, lang->getText(54));
textScoreBoard->writeCentered(offsetRight, offset1, Lang::get()->getText(54));
textScoreBoard->writeCentered(offsetRight, offset2, "0000000");
// PLAYER2 - MULT
textScoreBoard->writeCentered(offsetRight, offset3, lang->getText(55));
textScoreBoard->writeCentered(offsetRight, offset3, Lang::get()->getText(55));
textScoreBoard->writeCentered(offsetRight, offset4, "1.0");
}
// STAGE
textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset1, lang->getText(57) + std::to_string(stage[currentStage].number));
textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset1, Lang::get()->getText(57) + std::to_string(stage[currentStage].number));
// POWERMETER
powerMeterSprite->setPosY(offset2);
@@ -1412,7 +1408,7 @@ void Game::renderScoreBoard() {
powerMeterSprite->render();
// HI-SCORE
textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset3, lang->getText(56));
textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset3, Lang::get()->getText(56));
textScoreBoard->writeCentered(PLAY_AREA_CENTER_X, offset4, hiScoreName + updateScoreText(hiScore));
}
@@ -2458,10 +2454,10 @@ void Game::renderBackground() {
// Dibuja el juego
void Game::render() {
// 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 los objetos
renderBackground();
@@ -2484,7 +2480,7 @@ void Game::render() {
renderFlashEffect();
// Vuelca el contenido del renderizador en pantalla
screen->blit();
Screen::get()->blit();
}
// Gestiona el nivel de amenaza
@@ -2519,7 +2515,7 @@ void Game::checkGameInput() {
demo.keys.fireRight = 0;
// Atalls globals (zoom finestra, fullscreen, shaders, presets, ...)
GlobalInputs::handle(screen, input);
GlobalInputs::handle();
// Modo Demo activo
if (demo.enabled) {
@@ -2561,7 +2557,7 @@ void Game::checkGameInput() {
}
// Si se pulsa cualquier tecla, se sale del modo demo
if (input->checkAnyInput()) {
if (Input::get()->checkAnyInput()) {
section->name = SECTION_PROG_TITLE;
}
@@ -2579,12 +2575,12 @@ void Game::checkGameInput() {
for (auto player : players) {
if (player->isAlive()) {
// Input a la izquierda
if (input->checkInput(input_left, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (Input::get()->checkInput(input_left, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
player->setInput(input_left);
demo.keys.left = 1;
} else {
// Input a la derecha
if (input->checkInput(input_right, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (Input::get()->checkInput(input_right, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
player->setInput(input_right);
demo.keys.right = 1;
} else {
@@ -2594,7 +2590,7 @@ void Game::checkGameInput() {
}
}
// Comprueba el input de disparar al centro
if (input->checkInput(input_fire_center, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (Input::get()->checkInput(input_fire_center, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (player->canFire()) {
player->setInput(input_fire_center);
createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_UP, player->isPowerUp(), i);
@@ -2608,7 +2604,7 @@ void Game::checkGameInput() {
}
// Comprueba el input de disparar a la izquierda
if (input->checkInput(input_fire_left, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (Input::get()->checkInput(input_fire_left, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (player->canFire()) {
player->setInput(input_fire_left);
createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_LEFT, player->isPowerUp(), i);
@@ -2622,7 +2618,7 @@ void Game::checkGameInput() {
}
// Comprueba el input de disparar a la derecha
if (input->checkInput(input_fire_right, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (Input::get()->checkInput(input_fire_right, REPEAT_TRUE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (player->canFire()) {
player->setInput(input_fire_right);
createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_RIGHT, player->isPowerUp(), i);
@@ -2636,7 +2632,7 @@ void Game::checkGameInput() {
}
// Comprueba el input de pausa
if (input->checkInput(input_pause, REPEAT_FALSE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
if (Input::get()->checkInput(input_pause, REPEAT_FALSE, Options::inputs[i].deviceType, Options::inputs[i].id)) {
section->subsection = SUBSECTION_GAME_PAUSE;
}
@@ -2659,13 +2655,13 @@ void Game::checkGameInput() {
void Game::renderMessages() {
// GetReady
if ((counter < STAGE_COUNTER) && (!demo.enabled)) {
textNokiaBig2->write((int)getReadyBitmapPath[counter], PLAY_AREA_CENTER_Y - 8, lang->getText(75), -2);
textNokiaBig2->write((int)getReadyBitmapPath[counter], PLAY_AREA_CENTER_Y - 8, Lang::get()->getText(75), -2);
}
// Time Stopped
if (timeStopped) {
if ((timeStoppedCounter > 100) || (timeStoppedCounter % 10 > 4)) {
textNokia2->writeDX(TXT_CENTER, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, lang->getText(36) + std::to_string(timeStoppedCounter / 10), -1, noColor, 1, shdwTxtColor);
textNokia2->writeDX(TXT_CENTER, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, Lang::get()->getText(36) + std::to_string(timeStoppedCounter / 10), -1, noColor, 1, shdwTxtColor);
}
if (timeStoppedCounter > 100) {
@@ -2682,7 +2678,7 @@ void Game::renderMessages() {
// D E M O
if (demo.enabled) {
if (demo.counter % 30 > 14) {
textNokiaBig2->writeDX(TXT_CENTER, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, lang->getText(37), 0, noColor, 2, shdwTxtColor);
textNokiaBig2->writeDX(TXT_CENTER, PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, Lang::get()->getText(37), 0, noColor, 2, shdwTxtColor);
}
}
@@ -2692,17 +2688,17 @@ void Game::renderMessages() {
std::string text;
if (stageNum == 10) { // Ultima fase
text = lang->getText(79);
text = Lang::get()->getText(79);
} else { // X fases restantes
text = std::to_string(11 - stage[currentStage].number) + lang->getText(38);
text = std::to_string(11 - stage[currentStage].number) + Lang::get()->getText(38);
}
if (!gameCompleted) { // Escribe el numero de fases restantes
textNokiaBig2->writeDX(TXT_CENTER, PLAY_AREA_CENTER_X, stageBitmapPath[stageBitmapCounter], text, -2, noColor, 2, shdwTxtColor);
} else { // Escribe el texto de juego completado
text = lang->getText(50);
text = Lang::get()->getText(50);
textNokiaBig2->writeDX(TXT_CENTER, PLAY_AREA_CENTER_X, stageBitmapPath[stageBitmapCounter], text, -2, noColor, 1, shdwTxtColor);
textNokia2->writeDX(TXT_CENTER, PLAY_AREA_CENTER_X, stageBitmapPath[stageBitmapCounter] + textNokiaBig2->getCharacterSize() + 2, lang->getText(76), -1, noColor, 1, shdwTxtColor);
textNokia2->writeDX(TXT_CENTER, PLAY_AREA_CENTER_X, stageBitmapPath[stageBitmapCounter] + textNokiaBig2->getCharacterSize() + 2, Lang::get()->getText(76), -1, noColor, 1, shdwTxtColor);
}
}
}
@@ -2861,6 +2857,9 @@ void Game::updatePausedGame() {
// Actualiza el contador de ticks
ticks = SDL_GetTicks();
// Atalls globals (zoom finestra, fullscreen, shaders, presets, ...)
GlobalInputs::handle();
if (leavingPauseMenu) {
if (pauseCounter > 0) { // El contador está descendiendo
const bool a = pauseCounter == 90;
@@ -2913,10 +2912,10 @@ void Game::updatePausedGame() {
// Dibuja el menu de pausa del juego
void Game::renderPausedGame() {
// 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);
// Pinta el escenario
{
@@ -2948,7 +2947,7 @@ void Game::renderPausedGame() {
fade->render();
// Vuelca el contenido del renderizador en pantalla
screen->blit();
Screen::get()->blit();
}
// Inicializa el estado de pausa del juego
@@ -2974,6 +2973,9 @@ void Game::updateGameOverScreen() {
// Actualiza el contador de ticks
ticks = SDL_GetTicks();
// Atalls globals (zoom finestra, fullscreen, shaders, presets, ...)
GlobalInputs::handle();
// Actualiza la lógica del menu
gameOverMenu->update();
@@ -3043,10 +3045,10 @@ void Game::checkGameOverEvents() {
// Dibuja los elementos de la pantalla de game over
void Game::renderGameOverScreen() {
// 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);
// Dibujo
if (!gameCompleted) { // Dibujo de haber perdido la partida
@@ -3059,33 +3061,33 @@ void Game::renderGameOverScreen() {
if (numPlayers == 1) {
// Congratulations!!
if (gameCompleted) {
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 8), lang->getText(50));
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 8), Lang::get()->getText(50));
}
// Game Over
textBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 6), lang->getText(43));
textBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 6), Lang::get()->getText(43));
// Your Score
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 3), lang->getText(44) + std::to_string(players[0]->getScore()));
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 3), Lang::get()->getText(44) + std::to_string(players[0]->getScore()));
} else {
// Congratulations!!
if (gameCompleted) {
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 9), lang->getText(50));
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 9), Lang::get()->getText(50));
}
// Game Over
textBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 7), lang->getText(43));
textBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 7), Lang::get()->getText(43));
// Player1 Score
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 4), lang->getText(77) + std::to_string(players[0]->getScore()));
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 4), Lang::get()->getText(77) + std::to_string(players[0]->getScore()));
// Player2 Score
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 2), lang->getText(78) + std::to_string(players[1]->getScore()));
text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 2), Lang::get()->getText(78) + std::to_string(players[1]->getScore()));
}
// Continue?
if (!gameCompleted) { // Solo dibuja el menu de continuar en el caso de no haber completado la partida
text->writeCentered(199, PLAY_AREA_CENTER_Y + BLOCK * 3, lang->getText(45));
text->writeCentered(199, PLAY_AREA_CENTER_Y + BLOCK * 3, Lang::get()->getText(45));
gameOverMenu->render();
}
@@ -3093,7 +3095,7 @@ void Game::renderGameOverScreen() {
fade->render();
// Vuelca el contenido del renderizador en pantalla
screen->blit();
Screen::get()->blit();
}
// Inicializa el estado de game over
@@ -3158,7 +3160,7 @@ void Game::initPaths() {
}
// Letrero de GetReady
const int size = textNokiaBig2->lenght(lang->getText(75), -2);
const int size = textNokiaBig2->lenght(Lang::get()->getText(75), -2);
const float start1 = PLAY_AREA_LEFT - size;
const float finish1 = PLAY_AREA_CENTER_X - (size / 2);