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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user