Cambiado el tipo de vector de la clase menu a std::vector
This commit is contained in:
BIN
data/sound/sound_menu_cancel.wav
Normal file
BIN
data/sound/sound_menu_cancel.wav
Normal file
Binary file not shown.
BIN
data/sound/sound_menu_move.wav
Normal file
BIN
data/sound/sound_menu_move.wav
Normal file
Binary file not shown.
BIN
data/sound/sound_menu_select.wav
Normal file
BIN
data/sound/sound_menu_select.wav
Normal file
Binary file not shown.
137
source/menu.cpp
137
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;
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user