diff --git a/data/sound/sound_menu_cancel.wav b/data/sound/sound_menu_cancel.wav new file mode 100644 index 0000000..e33dc03 Binary files /dev/null and b/data/sound/sound_menu_cancel.wav differ diff --git a/data/sound/sound_menu_move.wav b/data/sound/sound_menu_move.wav new file mode 100644 index 0000000..6503184 Binary files /dev/null and b/data/sound/sound_menu_move.wav differ diff --git a/data/sound/sound_menu_select.wav b/data/sound/sound_menu_select.wav new file mode 100644 index 0000000..7475499 Binary files /dev/null and b/data/sound/sound_menu_select.wav differ diff --git a/source/menu.cpp b/source/menu.cpp index 02bcd57..cf7e9b6 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -16,22 +16,28 @@ Menu::~Menu() text = nullptr; input = nullptr; asset = nullptr; + + JA_DeleteSound(soundAccept); + JA_DeleteSound(soundCancel); + JA_DeleteSound(soundMove); } // Inicializador void Menu::init(std::string name, int x, int y, int backgroundType) { - loadMedia(); + // Sonidos + soundMove = JA_LoadSound(asset->get("sound_menu_move.wav").c_str()); + soundAccept = JA_LoadSound(asset->get("sound_menu_select.wav").c_str()); + soundCancel = JA_LoadSound(asset->get("sound_menu_cancel.wav").c_str()); // Inicia variables this->name = name; selector.index = 0; - totalItems = 0; itemSelected = MENU_NO_OPTION; this->x = x; this->y = y; - rectBG.rect = {0,0,0,0}; - rectBG.color = {0,0,0}; + rectBG.rect = {0, 0, 0, 0}; + rectBG.color = {0, 0, 0}; rectBG.a = 0; this->backgroundType = backgroundType; isCenteredOnX = false; @@ -55,35 +61,9 @@ void Menu::init(std::string name, int x, int y, int backgroundType) selector.moving = false; selector.resizing = false; selector.rect = {0, 0, 0, 0}; - selector.color = {0,0,0}; - selector.itemColor = {0,0,0}; + selector.color = {0, 0, 0}; + selector.itemColor = {0, 0, 0}; selector.a = 255; - - // Elementos del menu - for (int i = 0; i < MENU_MAX_ITEMS; i++) - { - item[i].label = ""; - item[i].rect = {0, 0, 0, 0}; - item[i].hPaddingDown = 0; - item[i].selectable = false; - item[i].greyed = false; - item[i].linkedDown = false; - item[i].linkedUp = false; - } -} - -// Carga los recursos necesarios para la sección 'Title' -bool Menu::loadMedia() -{ - // Indicador de éxito en la carga - bool success = true; - - // Sonidos - soundMove = JA_LoadSound(asset->get("").c_str()); - soundAccept = JA_LoadSound(asset->get("").c_str()); - soundCancel = JA_LoadSound(asset->get("").c_str()); - - return success; } // Obtiene el nombre del menu @@ -139,7 +119,7 @@ void Menu::updateSelector() { if (selector.h > selector.targetH) // Ha llegado al destino { - //selector.originH = selector.targetH = selector.rect.h = getSelectorHeight(selector.index); + // selector.originH = selector.targetH = selector.rect.h = getSelectorHeight(selector.index); selector.originH = selector.h = selector.targetH; selector.resizing = false; } @@ -148,7 +128,7 @@ void Menu::updateSelector() { if (selector.h < selector.targetH) // Ha llegado al destino { - //selector.originH = selector.targetH = selector.rect.h = getSelectorHeight(selector.index); + // selector.originH = selector.targetH = selector.rect.h = getSelectorHeight(selector.index); selector.originH = selector.h = selector.targetH; selector.resizing = false; } @@ -164,7 +144,7 @@ void Menu::updateSelector() // Coloca el selector en una posición específica void Menu::setSelectorPos(int index) { - if (index < totalItems) + if (index < item.size()) { selector.index = index; selector.rect.y = selector.y = selector.originY = selector.targetY = item[selector.index].rect.y; @@ -182,9 +162,10 @@ int Menu::getWidestItem() int result = 0; // Obtenemos la anchura del item mas ancho - for (int i = 0; i < totalItems; i++) - if (item[i].rect.w > result) - result = item[i].rect.w; + for (auto i : item) + { + result = std::max(result, i.rect.w); + } return result; } @@ -222,10 +203,11 @@ bool Menu::increaseSelectorIndex() selector.h = selector.originH = getSelectorHeight(selector.index); // Calcula cual es el siguiente elemento - ++selector.index %= totalItems; + ++selector.index %= item.size(); while (!item[selector.index].selectable) - //selector.index++; - ++selector.index %= totalItems; + { + ++selector.index %= item.size(); + } success = true; // Establece las coordenadas y altura de destino @@ -256,13 +238,17 @@ bool Menu::decreaseSelectorIndex() // Calcula cual es el siguiente elemento if (selector.index == 0) - selector.index = totalItems; + { + selector.index = item.size(); + } else + { selector.index--; + } while (!item[selector.index].selectable) { if (selector.index == 0) - selector.index = totalItems; + selector.index = item.size(); else selector.index--; } @@ -316,7 +302,7 @@ void Menu::render() } // Renderitza el texto - for (int i = 0; i < totalItems; i++) + for (int i = 0; i < item.size(); i++) { if (i == selector.index) { @@ -362,14 +348,6 @@ void Menu::setRectSize() setSelectorPos(selector.index); } -// Establece el valor de la variable -void Menu::setTotalItems(int num) -{ - totalItems = num; - if (totalItems > MENU_MAX_ITEMS) - totalItems = MENU_MAX_ITEMS; -} - // Establece el color del rectangulo de fondo void Menu::setBackgroundColor(color_t color, int alpha) { @@ -400,8 +378,10 @@ void Menu::centerMenuOnX(int value) x = (value) - (findWidth() / 2); // Reposiciona los elementos del menu - for (int i = 0; i < MENU_MAX_ITEMS; i++) - item[i].rect.x = x; + for (auto i : item) + { + i.rect.x = x; + } // Recalcula el rectangulo de fondo setRectSize(); @@ -428,31 +408,40 @@ void Menu::centerMenuElementsOnX() { areElementsCenteredOnX = true; - for (int i = 0; i < totalItems; i++) - item[i].rect.x = (centerX - (item[i].rect.w / 2)); + for (auto i : item) + { + i.rect.x = (centerX - (i.rect.w / 2)); + } } // Añade un item al menu void Menu::addItem(std::string text, int hPaddingDown, bool selectable, bool greyed, bool linkedDown) { + item_t temp; // Si es el primer item coge la posición en el eje Y del propio menu - if (totalItems == 0) - item[totalItems].rect.y = y; + if (item.size() == 0) + { + temp.rect.y = y; + } else - // En caso contrario, coge la posición en el eje Y a partir del elemento anterior - item[totalItems].rect.y = item[totalItems - 1].rect.y + item[totalItems - 1].rect.h + item[totalItems - 1].hPaddingDown; + // En caso contrario, coge la posición en el eje Y a partir del elemento anterior + { + temp.rect.y = item.back().rect.y + item.back().rect.h + item.back().hPaddingDown; + } - setItemCaption(totalItems, text); - item[totalItems].rect.x = x; - item[totalItems].hPaddingDown = hPaddingDown; - item[totalItems].selectable = selectable; - item[totalItems].greyed = greyed; - item[totalItems].linkedDown = linkedDown; - if (totalItems > 0) - if (item[totalItems - 1].linkedDown) - item[totalItems].linkedUp = true; + temp.rect.x = x; + temp.hPaddingDown = hPaddingDown; + temp.selectable = selectable; + temp.greyed = greyed; + temp.linkedDown = linkedDown; + + item.push_back(temp); + setItemCaption(item.size(), text); + + if (item.size() > 0) + if (item[item.size() - 1].linkedDown) + item[item.size()].linkedUp = true; - setTotalItems(totalItems + 1); centerX = x + (findWidth() / 2); reorganize(); } @@ -508,10 +497,12 @@ int Menu::findHeight() int height = 0; // Obtenemos la altura de la suma de alturas de los items - for (int i = 0; i < totalItems; i++) - height += item[i].rect.h + item[i].hPaddingDown; + for (auto i : item) + { + height += i.rect.h + i.hPaddingDown; + } - return height - item[totalItems - 1].hPaddingDown; + return height - item.back().hPaddingDown; } // Recoloca los elementos del menu en el eje Y @@ -519,7 +510,7 @@ void Menu::replaceElementsOnY() { item[0].rect.y = y; - for (int i = 1; i < totalItems; i++) + for (int i = 1; i < item.size(); i++) item[i].rect.y = item[i - 1].rect.y + item[i - 1].rect.h + item[i - 1].hPaddingDown; } diff --git a/source/menu.h b/source/menu.h index 8b4fea1..c3ff945 100644 --- a/source/menu.h +++ b/source/menu.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "sprite.h" #include "text.h" #include "input.h" @@ -11,9 +12,6 @@ #ifndef MENU_H #define MENU_H -// Cantidad máxima de items en el menu -#define MENU_MAX_ITEMS 50 - // Tipos de fondos para el menu #define MENU_BACKGROUND_TRANSPARENT 0 #define MENU_BACKGROUND_SOLID 1 @@ -30,7 +28,6 @@ private: int y; // Posición en el eje Y de la primera letra del primer elemento int h; // Altura del menu int w; // Anchura del menu - int totalItems; // Numero total de items del menu int itemSelected; // Índice del item del menu que ha sido seleccionado int defaultActionWhenCancel; // Indice del item del menu que se selecciona cuando se cancela el menu int backgroundType; // Tipo de fondo para el menu @@ -67,7 +64,7 @@ private: bool linkedDown; // Indica si el elemento actual y el siguiente se tratan como uno solo. Afecta al selector bool linkedUp; // Indica si el elemento actual y el anterior se tratan como uno solo. Afecta al selector }; - item_t item[MENU_MAX_ITEMS]; // Estructura para cada elemento del menu + std::vector item; // Estructura para cada elemento del menu struct selector_t { @@ -90,12 +87,6 @@ private: }; selector_t selector; // Variables para pintar el selector del menu - // Carga los recursos necesarios para la sección 'Title' - bool loadMedia(); - - // Establece el valor de la variable - void setTotalItems(int num); - // Establece el rectangulo de fondo del menu void setRectSize(); diff --git a/source/prog.cpp b/source/prog.cpp index 0f174e8..1789c64 100644 --- a/source/prog.cpp +++ b/source/prog.cpp @@ -162,6 +162,9 @@ bool Prog::setFileList() asset->add("/data/sound/sound_player_jump.wav", sound); asset->add("/data/sound/sound_menu_logo.wav", sound); asset->add("/data/sound/sound_menu_start.wav", sound); + asset->add("/data/sound/sound_menu_select.wav", sound); + asset->add("/data/sound/sound_menu_cancel.wav", sound); + asset->add("/data/sound/sound_menu_move.wav", sound); // Ficheros con musica asset->add("/data/music/music_title.ogg", music);