Cambiado el tipo de vector de la clase menu a std::vector

This commit is contained in:
2022-08-23 20:50:55 +02:00
parent bca15cd29e
commit 0749862af2
6 changed files with 70 additions and 85 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -16,22 +16,28 @@ Menu::~Menu()
text = nullptr; text = nullptr;
input = nullptr; input = nullptr;
asset = nullptr; asset = nullptr;
JA_DeleteSound(soundAccept);
JA_DeleteSound(soundCancel);
JA_DeleteSound(soundMove);
} }
// Inicializador // Inicializador
void Menu::init(std::string name, int x, int y, int backgroundType) 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 // Inicia variables
this->name = name; this->name = name;
selector.index = 0; selector.index = 0;
totalItems = 0;
itemSelected = MENU_NO_OPTION; itemSelected = MENU_NO_OPTION;
this->x = x; this->x = x;
this->y = y; this->y = y;
rectBG.rect = {0,0,0,0}; rectBG.rect = {0, 0, 0, 0};
rectBG.color = {0,0,0}; rectBG.color = {0, 0, 0};
rectBG.a = 0; rectBG.a = 0;
this->backgroundType = backgroundType; this->backgroundType = backgroundType;
isCenteredOnX = false; isCenteredOnX = false;
@@ -55,35 +61,9 @@ void Menu::init(std::string name, int x, int y, int backgroundType)
selector.moving = false; selector.moving = false;
selector.resizing = false; selector.resizing = false;
selector.rect = {0, 0, 0, 0}; selector.rect = {0, 0, 0, 0};
selector.color = {0,0,0}; selector.color = {0, 0, 0};
selector.itemColor = {0,0,0}; selector.itemColor = {0, 0, 0};
selector.a = 255; 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 // Obtiene el nombre del menu
@@ -139,7 +119,7 @@ void Menu::updateSelector()
{ {
if (selector.h > selector.targetH) // Ha llegado al destino 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.originH = selector.h = selector.targetH;
selector.resizing = false; selector.resizing = false;
} }
@@ -148,7 +128,7 @@ void Menu::updateSelector()
{ {
if (selector.h < selector.targetH) // Ha llegado al destino 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.originH = selector.h = selector.targetH;
selector.resizing = false; selector.resizing = false;
} }
@@ -164,7 +144,7 @@ void Menu::updateSelector()
// Coloca el selector en una posición específica // Coloca el selector en una posición específica
void Menu::setSelectorPos(int index) void Menu::setSelectorPos(int index)
{ {
if (index < totalItems) if (index < item.size())
{ {
selector.index = index; selector.index = index;
selector.rect.y = selector.y = selector.originY = selector.targetY = item[selector.index].rect.y; selector.rect.y = selector.y = selector.originY = selector.targetY = item[selector.index].rect.y;
@@ -182,9 +162,10 @@ int Menu::getWidestItem()
int result = 0; int result = 0;
// Obtenemos la anchura del item mas ancho // Obtenemos la anchura del item mas ancho
for (int i = 0; i < totalItems; i++) for (auto i : item)
if (item[i].rect.w > result) {
result = item[i].rect.w; result = std::max(result, i.rect.w);
}
return result; return result;
} }
@@ -222,10 +203,11 @@ bool Menu::increaseSelectorIndex()
selector.h = selector.originH = getSelectorHeight(selector.index); selector.h = selector.originH = getSelectorHeight(selector.index);
// Calcula cual es el siguiente elemento // Calcula cual es el siguiente elemento
++selector.index %= totalItems; ++selector.index %= item.size();
while (!item[selector.index].selectable) while (!item[selector.index].selectable)
//selector.index++; {
++selector.index %= totalItems; ++selector.index %= item.size();
}
success = true; success = true;
// Establece las coordenadas y altura de destino // Establece las coordenadas y altura de destino
@@ -256,13 +238,17 @@ bool Menu::decreaseSelectorIndex()
// Calcula cual es el siguiente elemento // Calcula cual es el siguiente elemento
if (selector.index == 0) if (selector.index == 0)
selector.index = totalItems; {
selector.index = item.size();
}
else else
{
selector.index--; selector.index--;
}
while (!item[selector.index].selectable) while (!item[selector.index].selectable)
{ {
if (selector.index == 0) if (selector.index == 0)
selector.index = totalItems; selector.index = item.size();
else else
selector.index--; selector.index--;
} }
@@ -316,7 +302,7 @@ void Menu::render()
} }
// Renderitza el texto // Renderitza el texto
for (int i = 0; i < totalItems; i++) for (int i = 0; i < item.size(); i++)
{ {
if (i == selector.index) if (i == selector.index)
{ {
@@ -362,14 +348,6 @@ void Menu::setRectSize()
setSelectorPos(selector.index); 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 // Establece el color del rectangulo de fondo
void Menu::setBackgroundColor(color_t color, int alpha) void Menu::setBackgroundColor(color_t color, int alpha)
{ {
@@ -400,8 +378,10 @@ void Menu::centerMenuOnX(int value)
x = (value) - (findWidth() / 2); x = (value) - (findWidth() / 2);
// Reposiciona los elementos del menu // Reposiciona los elementos del menu
for (int i = 0; i < MENU_MAX_ITEMS; i++) for (auto i : item)
item[i].rect.x = x; {
i.rect.x = x;
}
// Recalcula el rectangulo de fondo // Recalcula el rectangulo de fondo
setRectSize(); setRectSize();
@@ -428,31 +408,40 @@ void Menu::centerMenuElementsOnX()
{ {
areElementsCenteredOnX = true; areElementsCenteredOnX = true;
for (int i = 0; i < totalItems; i++) for (auto i : item)
item[i].rect.x = (centerX - (item[i].rect.w / 2)); {
i.rect.x = (centerX - (i.rect.w / 2));
}
} }
// Añade un item al menu // Añade un item al menu
void Menu::addItem(std::string text, int hPaddingDown, bool selectable, bool greyed, bool linkedDown) 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 // Si es el primer item coge la posición en el eje Y del propio menu
if (totalItems == 0) if (item.size() == 0)
item[totalItems].rect.y = y; {
temp.rect.y = y;
}
else else
// En caso contrario, coge la posición en el eje Y a partir del elemento anterior // 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; {
temp.rect.y = item.back().rect.y + item.back().rect.h + item.back().hPaddingDown;
}
setItemCaption(totalItems, text); temp.rect.x = x;
item[totalItems].rect.x = x; temp.hPaddingDown = hPaddingDown;
item[totalItems].hPaddingDown = hPaddingDown; temp.selectable = selectable;
item[totalItems].selectable = selectable; temp.greyed = greyed;
item[totalItems].greyed = greyed; temp.linkedDown = linkedDown;
item[totalItems].linkedDown = linkedDown;
if (totalItems > 0) item.push_back(temp);
if (item[totalItems - 1].linkedDown) setItemCaption(item.size(), text);
item[totalItems].linkedUp = true;
if (item.size() > 0)
if (item[item.size() - 1].linkedDown)
item[item.size()].linkedUp = true;
setTotalItems(totalItems + 1);
centerX = x + (findWidth() / 2); centerX = x + (findWidth() / 2);
reorganize(); reorganize();
} }
@@ -508,10 +497,12 @@ int Menu::findHeight()
int height = 0; int height = 0;
// Obtenemos la altura de la suma de alturas de los items // Obtenemos la altura de la suma de alturas de los items
for (int i = 0; i < totalItems; i++) for (auto i : item)
height += item[i].rect.h + item[i].hPaddingDown; {
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 // Recoloca los elementos del menu en el eje Y
@@ -519,7 +510,7 @@ void Menu::replaceElementsOnY()
{ {
item[0].rect.y = y; 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; item[i].rect.y = item[i - 1].rect.y + item[i - 1].rect.h + item[i - 1].hPaddingDown;
} }

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include <vector>
#include "sprite.h" #include "sprite.h"
#include "text.h" #include "text.h"
#include "input.h" #include "input.h"
@@ -11,9 +12,6 @@
#ifndef MENU_H #ifndef MENU_H
#define MENU_H #define MENU_H
// Cantidad máxima de items en el menu
#define MENU_MAX_ITEMS 50
// Tipos de fondos para el menu // Tipos de fondos para el menu
#define MENU_BACKGROUND_TRANSPARENT 0 #define MENU_BACKGROUND_TRANSPARENT 0
#define MENU_BACKGROUND_SOLID 1 #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 y; // Posición en el eje Y de la primera letra del primer elemento
int h; // Altura del menu int h; // Altura del menu
int w; // Anchura 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 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 defaultActionWhenCancel; // Indice del item del menu que se selecciona cuando se cancela el menu
int backgroundType; // Tipo de fondo para 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 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 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_t> item; // Estructura para cada elemento del menu
struct selector_t struct selector_t
{ {
@@ -90,12 +87,6 @@ private:
}; };
selector_t selector; // Variables para pintar el selector del menu 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 // Establece el rectangulo de fondo del menu
void setRectSize(); void setRectSize();

View File

@@ -162,6 +162,9 @@ bool Prog::setFileList()
asset->add("/data/sound/sound_player_jump.wav", sound); asset->add("/data/sound/sound_player_jump.wav", sound);
asset->add("/data/sound/sound_menu_logo.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_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 // Ficheros con musica
asset->add("/data/music/music_title.ogg", music); asset->add("/data/music/music_title.ogg", music);