From f83154c06292a18f12ea3775494136b89fe5b058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Sun, 9 Oct 2022 14:23:45 +0200 Subject: [PATCH] Listo para lanzamiento --- data/lang/ba_BA.txt | 12 +-- data/lang/en_UK.txt | 12 +-- data/lang/es_ES.txt | 12 +-- data/menu/gameover.men | 3 +- data/menu/options.men | 3 +- data/menu/pause.men | 13 ++- data/menu/player_select.men | 40 ++++++++ data/menu/title.men | 3 +- data/sound/menu_cancel.wav | Bin 46542 -> 0 bytes source/director.cpp | 9 +- source/game.cpp | 197 +++++++++++++++++++----------------- source/game.h | 17 +++- source/menu.cpp | 13 ++- source/title.cpp | 50 ++++++++- source/title.h | 9 +- source/utils.h | 1 + 16 files changed, 249 insertions(+), 145 deletions(-) create mode 100644 data/menu/player_select.men delete mode 100644 data/sound/menu_cancel.wav diff --git a/data/lang/ba_BA.txt b/data/lang/ba_BA.txt index 2a95bc8..c8a76a5 100644 --- a/data/lang/ba_BA.txt +++ b/data/lang/ba_BA.txt @@ -115,14 +115,14 @@ D E M O ## 38 - TEXTOS DEL JUEGO fases mes! -## 39 - -- +## 39 - MENU SELECCION DE JUGADOR +Selecciona personatge -## 40 - -- +## 40 - MENU SELECCION DE JUGADOR +Enrere -## 41 - -- +## 41 - MENU DE PAUSA +Menu de pausa ## 42 - - diff --git a/data/lang/en_UK.txt b/data/lang/en_UK.txt index ddb62f5..3329a6c 100644 --- a/data/lang/en_UK.txt +++ b/data/lang/en_UK.txt @@ -115,14 +115,14 @@ D E M O ## 38 - TEXTOS DEL JUEGO stages left! -## 39 - -- +## 39 - MENU SELECCION DE JUGADOR +Select Player -## 40 - -- +## 40 - MENU SELECCION DE JUGADOR +Back -## 41 - -- +## 41 - MENU DE PAUSA +Pause Menu ## 42 - - diff --git a/data/lang/es_ES.txt b/data/lang/es_ES.txt index f92c032..84b7b87 100644 --- a/data/lang/es_ES.txt +++ b/data/lang/es_ES.txt @@ -115,14 +115,14 @@ D E M O ## 38 - TEXTOS DEL JUEGO fases mas! -## 39 - -- +## 39 - MENU SELECCION DE JUGADOR +Selecciona jugador -## 40 - -- +## 40 - MENU SELECCION DE JUGADOR +Volver -## 41 - -- +## 41 - MENU DE PAUSA +Menu de pausa ## 42 - - diff --git a/data/menu/gameover.men b/data/menu/gameover.men index 89fcdf9..ecb1eb7 100644 --- a/data/menu/gameover.men +++ b/data/menu/gameover.men @@ -1,9 +1,8 @@ font_png=smb2.png font_txt=smb2.txt -sound_cancel=menu_cancel.wav -sound_accept=menu_select.wav sound_move=menu_move.wav +sound_accept=menu_select.wav name=GAME OVER x=0 diff --git a/data/menu/options.men b/data/menu/options.men index 5290c85..f61b457 100644 --- a/data/menu/options.men +++ b/data/menu/options.men @@ -1,9 +1,8 @@ font_png=smb2.png font_txt=smb2.txt -sound_cancel=menu_cancel.wav -sound_accept=menu_select.wav sound_move=menu_move.wav +sound_accept=menu_select.wav name=OPTIONS x=0 diff --git a/data/menu/pause.men b/data/menu/pause.men index 6759aae..d22d7cc 100644 --- a/data/menu/pause.men +++ b/data/menu/pause.men @@ -1,13 +1,12 @@ font_png=smb2.png font_txt=smb2.txt -sound_cancel=menu_cancel.wav -sound_accept=menu_select.wav sound_move=menu_move.wav +sound_accept=menu_select.wav name=PAUSE x=0 -y=96 +y=80 backgroundType=1 backgroundColor=41,57,65,240 @@ -18,7 +17,13 @@ centerX=128 selector_color=255,122,0,255 selector_text_color=255,255,255 -defaultActionWhenCancel=0 +defaultActionWhenCancel=1 + +[item] +text=PAUSE MENU +hPaddingDown=7 +selectable=false +[/item] [item] text=CONTINUE diff --git a/data/menu/player_select.men b/data/menu/player_select.men new file mode 100644 index 0000000..cf5dae0 --- /dev/null +++ b/data/menu/player_select.men @@ -0,0 +1,40 @@ +font_png=smb2.png +font_txt=smb2.txt + +sound_move=menu_move.wav +sound_accept=menu_select.wav + +name=PLAYER_SELECT +x=0 +y=116 +backgroundType=0 +backgroundColor=48,48,64,192 + +areElementsCenteredOnX=true +isCenteredOnX=true +centerX=128 + +selector_color=229,28,35,0 +selector_text_color=255,180,0 + +defaultActionWhenCancel=3 + +[item] +text=SELECT PLAYER +hPaddingDown=7 +selectable=false +[/item] + +[item] +text=BAL1 +hPaddingDown=2 +[/item] + +[item] +text=AROUNDER +hPaddingDown=7 +[/item] + +[item] +text=BACK +[/item] \ No newline at end of file diff --git a/data/menu/title.men b/data/menu/title.men index 5d87cb4..b82f2f9 100644 --- a/data/menu/title.men +++ b/data/menu/title.men @@ -1,9 +1,8 @@ font_png=smb2.png font_txt=smb2.txt -sound_cancel=menu_cancel.wav -sound_accept=menu_select.wav sound_move=menu_move.wav +sound_accept=menu_select.wav name=TITLE x=0 diff --git a/data/sound/menu_cancel.wav b/data/sound/menu_cancel.wav deleted file mode 100644 index e33dc03425a72ef0b1bc13e9e17112ffca85a416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46542 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%0AI@3hLZ3S@SIg~yd#^{Ji*d`haqx9EM> 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∾qk!f{1&ig%QpEwz-julT(3 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�Z^fe8ekY5EnG%lhE?HZVY zfu6!uqJ(T5jeyq5v|^-Q(QYX9iu{Jxt2*)lh-Mbd5BUx)xTd{X@;PYTNb^E1k*z0w zq<-6wQwAJXlsj=(j#8@a!mK;MO9DnlJAFiBT93)VQ{-2$NIl@NMwDq`OK7+56l12~#Nf?}HfksXEsg{V8`awA9T0qa} z`7eu>$;*9xI`B(<#OH)?5Wd&Hv=2mj#DiZdB~ON)9eV(61q|g=i_}+wr19C2L;FOp zA*tN%#pv+D65iJ>(EflM*R+@5{vRH@_s-#M!3BIS{a;Ewc#V(t9cU+t zN^M@uRLcq3px(XCc@0Coqwx^@>v2#HQHE$h`L9y}SJXoqBlV0@4`@eYeHi>6cplKXVDDC;$Ke diff --git a/source/director.cpp b/source/director.cpp index a45eaf1..d51149f 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -8,11 +8,7 @@ Director::Director(std::string path) { // Inicializa variables - section.name = PROG_SECTION_GAME; - section.subsection = GAME_SECTION_PLAY_1P; - - section.name = PROG_SECTION_TITLE; - section.subsection = TITLE_SECTION_1; + section.name = PROG_SECTION_LOGO; // Crea el objeto que controla los ficheros de recursos asset = new Asset(path.substr(0, path.find_last_of("\\/")) + "/../"); @@ -186,7 +182,6 @@ bool Director::setFileList() asset->add("data/sound/hiscore.wav", t_sound); asset->add("data/sound/itemdrop.wav", t_sound); asset->add("data/sound/itempickup.wav", t_sound); - asset->add("data/sound/menu_cancel.wav", t_sound); asset->add("data/sound/menu_move.wav", t_sound); asset->add("data/sound/menu_select.wav", t_sound); asset->add("data/sound/player_collision.wav", t_sound); @@ -280,6 +275,7 @@ bool Director::setFileList() asset->add("data/menu/options.men", t_data); asset->add("data/menu/pause.men", t_data); asset->add("data/menu/gameover.men", t_data); + asset->add("data/menu/player_select.men", t_data); return asset->check(); } @@ -305,6 +301,7 @@ bool Director::loadConfigFile() options->windowSize = 3; options->language = ba_BA; options->difficulty = DIFFICULTY_NORMAL; + options->playerSelected = 0; options->filter = FILTER_NEAREST; options->vSync = true; options->screenWidth = GAME_WIDTH; diff --git a/source/game.cpp b/source/game.cpp index c269779..4ff7372 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -199,14 +199,14 @@ void Game::init() // Crea los jugadores if (numPlayers == 1) { - Player *player = new Player(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, renderer, player1Textures, playerAnimations); + Player *player = new Player(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, renderer, playerTextures.at(options->playerSelected), playerAnimations); players.push_back(player); } else if (numPlayers == 2) { - Player *player1 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, renderer, player1Textures, playerAnimations); - Player *player2 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, renderer, player2Textures, playerAnimations); + Player *player1 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, renderer, playerTextures.at(0), playerAnimations); + Player *player2 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, renderer, playerTextures.at(1), playerAnimations); players.push_back(player1); players.push_back(player2); } @@ -447,6 +447,8 @@ void Game::loadMedia() LTexture *player1Fire = new LTexture(renderer, asset->get("player_bal1_fire.png")); player1Textures.push_back(player1Fire); + playerTextures.push_back(player1Textures); + // Texturas - Player2 LTexture *player2Head = new LTexture(renderer, asset->get("player_arounder_head.png")); player2Textures.push_back(player2Head); @@ -463,6 +465,8 @@ void Game::loadMedia() LTexture *player2Fire = new LTexture(renderer, asset->get("player_arounder_fire.png")); player2Textures.push_back(player2Fire); + playerTextures.push_back(player2Textures); + // Animaciones -- Jugador std::vector *playerHeadAnimation = new std::vector; loadAnimations(asset->get("player_head.ani"), playerHeadAnimation); @@ -541,8 +545,9 @@ void Game::loadMedia() gameOverMenu->setRectSize(w, 0); gameOverMenu->centerMenuOnX(199); pauseMenu = new Menu(renderer, asset, input, asset->get("pause.men")); - pauseMenu->setItemCaption(0, lang->getText(46)); - pauseMenu->setItemCaption(1, lang->getText(47)); + pauseMenu->setItemCaption(0, lang->getText(41)); + pauseMenu->setItemCaption(1, lang->getText(46)); + pauseMenu->setItemCaption(2, lang->getText(47)); // Sonidos balloonSound = JA_LoadSound(asset->get("balloon.wav").c_str()); @@ -3272,6 +3277,97 @@ section_t Game::run() return section; } +// Actualiza las variables del menu de pausa del juego +void Game::updatePausedGame() +{ + // Comprueba los eventos que hay en la cola + checkEventHandler(); + + // Calcula la lógica de los objetos + if (SDL_GetTicks() - ticks > ticksSpeed) + { + // Actualiza el contador de ticks + ticks = SDL_GetTicks(); + + // Actualiza la lógica del menu de pausa + pauseMenu->update(); + + // Comprueba las entradas para el menu + pauseMenu->checkInput(); + + // Comprueba si se ha seleccionado algún item del menú + switch (pauseMenu->getItemSelected()) + { + case 1: + section.name = PROG_SECTION_GAME; + section.subsection = numPlayers == 1 ? GAME_SECTION_PLAY_1P : GAME_SECTION_PLAY_2P; + + if (JA_GetMusicState() == JA_MUSIC_PAUSED) + { + JA_ResumeMusic(); + } + break; + + case 2: + fade->setFadeType(FADE_CENTER); + fade->activateFade(); + break; + + default: + break; + } + + // Actualiza el fade + fade->update(); + if (fade->hasEnded()) + { + section.name = PROG_SECTION_TITLE; + section.subsection = TITLE_SECTION_1; + JA_StopMusic(); + } + } +} + +// Dibuja el menu de pausa del juego +void Game::renderPausedGame() +{ + // Prepara para empezar a dibujar en la textura de juego + screen->start(); + + // Limpia la pantalla + screen->clean(bgColor); + + // Pinta el escenario + { + renderBackground(); + renderBalloons(); + renderBullets(); + renderMessages(); + renderItems(); + renderSmartSprites(); + renderScoreBoard(); + renderPlayers(); + + if ((deathCounter <= 150) && !players.at(0)->isAlive()) + { + renderDeathFade(150 - deathCounter); + } + + if ((gameCompleted) && (gameCompletedCounter >= GAME_COMPLETED_START_FADE)) + { + renderDeathFade(gameCompletedCounter - GAME_COMPLETED_START_FADE); + } + + renderFlashEffect(); + } + + pauseMenu->render(); + fade->render(); + + // Vuelca el contenido del renderizador en pantalla + screen->blit(); +} + // Bucle para el menu de pausa del juego void Game::runPausedGame() { @@ -3280,95 +3376,8 @@ void Game::runPausedGame() while ((section.subsection == GAME_SECTION_PAUSE) && (section.name == PROG_SECTION_GAME)) { - // Comprueba los eventos que hay en la cola - checkEventHandler(); - - // Calcula la lógica de los objetos - if (SDL_GetTicks() - ticks > ticksSpeed) - { - // Actualiza el contador de ticks - ticks = SDL_GetTicks(); - - // Actualiza la lógica del menu - pauseMenu->update(); - fade->update(); - if (fade->hasEnded()) - { - section.name = PROG_SECTION_TITLE; - section.subsection = TITLE_SECTION_1; - JA_StopMusic(); - break; - } - } - - // Prepara para empezar a dibujar en la textura de juego - screen->start(); - - // Limpia la pantalla - screen->clean(bgColor); - - // Pinta el escenario - { - renderBackground(); - renderBalloons(); - renderBullets(); - renderMessages(); - renderItems(); - renderSmartSprites(); - renderScoreBoard(); - renderPlayers(); - - if ((deathCounter <= 150) && !players.at(0)->isAlive()) - { - renderDeathFade(150 - deathCounter); - } - - if ((gameCompleted) && (gameCompletedCounter >= GAME_COMPLETED_START_FADE)) - { - renderDeathFade(gameCompletedCounter - GAME_COMPLETED_START_FADE); - } - - renderFlashEffect(); - } - - pauseMenu->render(); - fade->render(); - - // Vuelca el contenido del renderizador en pantalla - screen->blit(); - - // Comprueba las entradas para el menu - pauseMenu->checkInput(); - - // Comprueba si se ha seleccionado algún item del menú - switch (pauseMenu->getItemSelected()) - { - case 0: - section.name = PROG_SECTION_GAME; - - if (numPlayers == 1) - { - section.subsection = GAME_SECTION_PLAY_1P; - } - else - { - section.subsection = GAME_SECTION_PLAY_2P; - } - - if (JA_GetMusicState() == JA_MUSIC_PAUSED) - { - JA_ResumeMusic(); - } - break; - - case 1: - fade->setFadeType(FADE_CENTER); - fade->activateFade(); - break; - - default: - break; - } + updatePausedGame(); + renderPausedGame(); } } diff --git a/source/game.h b/source/game.h index bae7531..9eb03eb 100644 --- a/source/game.h +++ b/source/game.h @@ -127,11 +127,12 @@ private: std::vector items; // Vector con los items std::vector smartSprites; // Vector con los smartsprites - LTexture *bulletTexture; // Textura para las balas - std::vector itemTextures; // Vector con las texturas de los items - std::vector balloonTextures; // Vector con las texturas de los globos - std::vector player1Textures; // Vector con las texturas del jugador - std::vector player2Textures; // Vector con las texturas del jugador + LTexture *bulletTexture; // Textura para las balas + std::vector itemTextures; // Vector con las texturas de los items + std::vector balloonTextures; // Vector con las texturas de los globos + std::vector player1Textures; // Vector con las texturas del jugador + std::vector player2Textures; // Vector con las texturas del jugador + std::vector> playerTextures; // Vector con todas las texturas de los jugadores; LTexture *gameBuildingsTexture; // Textura con los edificios de fondo LTexture *gameCloudsTexture; // Textura con las nubes de fondo @@ -464,6 +465,12 @@ private: // Agita la pantalla void shakeScreen(); + // Actualiza las variables del menu de pausa del juego + void updatePausedGame(); + + // Dibuja el menu de pausa del juego + void renderPausedGame(); + // Bucle para el menu de pausa del juego void runPausedGame(); diff --git a/source/menu.cpp b/source/menu.cpp index 56dcbe6..8c0f904 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -58,6 +58,9 @@ Menu::Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file) { load(file); } + + // Deja el cursor en el primer elemento + reset(); } Menu::~Menu() @@ -492,6 +495,13 @@ void Menu::reset() selector.originH = selector.targetH = item[0].rect.h; selector.moving = false; selector.resizing = false; + + // Si el primer elemento no es seleccionable, incrementa el selector + if (!item[selector.index].selectable) + { + increaseSelectorIndex(); + setSelectorPos(selector.index); + } } // Actualiza el menu para recolocarlo correctamente y establecer el tamaño @@ -833,9 +843,6 @@ void Menu::setItemCaption(int index, std::string text) item.at(index).rect.w = this->text->lenght(item.at(index).label); item.at(index).rect.h = this->text->getCharacterSize(); reorganize(); - - const std::string t = item.at(index).label + ":" + std::to_string(item.at(index).rect.w); - printf("Adding menu item -> %s\n", t.c_str()); } // Establece el indice del itemm que se usará por defecto al cancelar el menu diff --git a/source/title.cpp b/source/title.cpp index 7356225..f613dc9 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -13,7 +13,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset, this->section = section; - // Reserva memoria para los punteros propios + // Reserva memoria para los punteros eventHandler = new SDL_Event(); fade = new Fade(renderer); @@ -33,6 +33,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset, menu.title = new Menu(renderer, asset, input, asset->get("title.men")); menu.options = new Menu(renderer, asset, input, asset->get("options.men")); + menu.playerSelect = new Menu(renderer, asset, input, asset->get("player_select.men")); // Sonidos crashSound = JA_LoadSound(asset->get("title.wav").c_str()); @@ -73,6 +74,7 @@ Title::~Title() delete menu.title; delete menu.options; + delete menu.playerSelect; JA_DeleteSound(crashSound); JA_DeleteMusic(titleMusic); @@ -319,14 +321,13 @@ void Title::update() menu.active->update(); } - // Comprueba si se ha seleccionado algún item del menú + // Comprueba si se ha seleccionado algún item del menú de titulo if (menu.active->getName() == "TITLE") { switch (menu.active->getItemSelected()) { - case 0: // 1 PLAYER - postFade = 0; - fade->activateFade(); + case 0: // 1 PLAYER -> Cambia al manu de selección de jugador + menu.active = menu.playerSelect; break; case 1: // 2 PLAYERS @@ -349,6 +350,37 @@ void Title::update() } } + // Comprueba si se ha seleccionado algún item del menú de selección de jugador + if (menu.active->getName() == "PLAYER_SELECT") + { + switch (menu.active->getItemSelected()) + { + case 0: + // Este item no se puede seleccionar y actua de titulo + break; + + case 1: // BAL1 + postFade = 0; + options->playerSelected = 0; + fade->activateFade(); + break; + + case 2: // AROUNDER + postFade = 0; + options->playerSelected = 1; + fade->activateFade(); + break; + + case 3: // BACK + menu.active = menu.title; + menu.playerSelect->reset(); + break; + + default: + break; + } + } + // Comprueba si se ha seleccionado algún item de opciones if (menu.active->getName() == "OPTIONS") { @@ -873,6 +905,14 @@ void Title::updateMenuLabels() // Recoloca el menu de titulo menu.title->centerMenuOnX(SCREEN_CENTER_X); 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 + + // Recoloca el menu de selección de jugador + menu.playerSelect->centerMenuOnX(SCREEN_CENTER_X); + menu.playerSelect->centerMenuElementsOnX(); } // Aplica las opciones de menu seleccionadas diff --git a/source/title.h b/source/title.h index b2b8e54..741a2e6 100644 --- a/source/title.h +++ b/source/title.h @@ -35,10 +35,11 @@ class Title private: struct menu_t { - Menu *title; // Menu de la pantalla de título - Menu *options; // Menú de la pantalla de opciones - Menu *active; // Menu activo (de momento para la pantalla del titulo) - bool keyPressed; // Variable para evitar la repetición de teclas en los menus + Menu *title; // Menu de la pantalla de título + Menu *options; // Menú de la pantalla de opciones + Menu *playerSelect; // Menu para elegir jugador + Menu *active; // Menu activo (de momento para la pantalla del titulo) + bool keyPressed; // Variable para evitar la repetición de teclas en los menus }; // Objetos diff --git a/source/utils.h b/source/utils.h index 7a93f73..602961a 100644 --- a/source/utils.h +++ b/source/utils.h @@ -87,6 +87,7 @@ struct input_t struct options_t { Uint8 difficulty; // Dificultad del juego + Uint8 playerSelected; // Jugador seleccionado para el modo 1P std::vector input; // Modo de control (teclado o mando) Uint8 language; // Idioma usado en el juego Uint32 fullScreenMode; // Contiene el valor del modo de pantalla completa