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;
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;
}

View File

@@ -1,6 +1,7 @@
#pragma once
#include <SDL2/SDL.h>
#include <vector>
#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_t> 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();

View File

@@ -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);