Files
volcano_2022/source/menu.h

162 lines
4.8 KiB
C++

#pragma once
#include "sprite.h"
#include "text.h"
#ifndef MENU_H
#define MENU_H
// Clase menu
class Menu
{
public:
// Constructor
Menu();
// Destructor
~Menu();
// Inicializador
void init(std::string name, int x, int y, int backgroundType, LTexture *texture, SDL_Renderer *renderer, Text *text);
// Obtiene el nombre del menu
std::string getName();
// Obtiene el valor de la variable
Uint8 getItemSelected();
// Deja el menu apuntando al primer elemento
void reset();
// Deja el menu sin elemento seleccionado
void deselectItem();
// Comprueba la entrada (teclado, gamepad) y actua en consecuencia
bool checkInput(Uint8 input);
// Actualiza la logica del menu
void update();
// Pinta el menu en pantalla
void render();
// Establece el color del rectangulo de fondo
void setBackgroundColor(int r, int g, int b, int alpha);
// Establece el color del rectangulo del selector
void setSelectorColor(int r, int g, int b, int alpha);
// Establece el color del texto del selector
void setSelectorTextColor(int r, int g, int b);
// Centra el menu respecto a un punto
void centerMenu(int value);
// Centra los elementos del menu
void centerMenuElements();
// Añade un item al menu
void addItem(std::string text, const Uint8 hPaddingUp = 0, const Uint8 hPaddingDown = 0);
// Cambia el texto de un item
void setItemCaption(Uint8 index, std::string text);
// Establece el indice del item que se usará por defecto al cancelar el menu
void setDefaultActionWhenCancel(Uint8 item);
private:
// Establece el valor de la variable
void setTotalItems(int num);
// Establece el rectangulo de fondo del menu
void setRectSize();
// Actualiza el menu para recolocarlo correctamente y establecer el tamaño
void reorganize();
// Deja el menu apuntando al siguiente elemento
bool increaseSelectorIndex();
// Deja el menu apuntando al elemento anterior
bool decreaseSelectorIndex();
// Mueve el grafico del selector al elemento seleccionado
//void moveSelectorSprite(int pos);
// Actualiza la posicion y el estado del selector
void updateSelector();
// Establece el origen del selector
void setSelectorOrigin(int value);
// Establece el destino del selector
void setSelectorTarget(int value);
// Coloca el selector en una posición específica
void setSelectorPos(Uint8 index);
// Obtiene la anchura del elemento más ancho del menu
Uint16 getWidestItem();
bool mAreElementsCentered; // Variable para saber si los elementos del menu van centrados respecto a este
bool mIsCentered; // Variable para saber si el menu debe estar centrado respecto a un punto
int mCenter; // Centro del menu
int mPosX; // En esta posición del eje X se pinta la primera letra del primer elemento
int mPosY; // En esta posición del eje Y se pinta la primera letra del primer elemento
SDL_Renderer *mRenderer; // Puntero al renderizador de la ventana
std::string mName; // Nombre del menu
Text *mText; // Objeto de texto para poder escribir los items del menu
Uint16 mWidestItem; // Anchura del elemento más ancho
Uint8 mBackgroundType; // Tipo de fondo para el menu, visible o no
Uint8 mDefaultActionWhenCancel; // Item del menu que se selecciona cuando se cancela el menu
Uint8 mItemSelected; // Item del menu que ha sido seleccionado
Uint8 mTotalItems; // Numero de items del menu
Uint8 mVerticalPadding; // Espacio de separacion entre items
struct rectangle
{
Uint8 x; // Posición en el eje X
Uint8 y; // Posición en el eje Y
Uint8 w; // Anchura
Uint8 h; // Altura
Uint8 r; // Rojo
Uint8 g; // Verde
Uint8 b; // Azul
Uint8 a; // Transparencia
};
rectangle mRectBG; // Rectangulo de fondo del menu
// Estructura para cada elemento del menu
struct item
{
std::string label; // Texto del elemento
int x; // Posición en el eje X donde se empieza a escribir el texto
int y; // Posición en el eje Y donde se empieza a escribir el texto
Uint8 w; // Anchura del elemento
Uint8 h; // Altura del elemento
Uint8 hPaddingUp; // Espacio vacío arriba
Uint8 hPaddingDown; // Espacio vacío abajo
};
item mItem[10];
struct selector
{
double origin; // Coordenada de origen
double target; // Coordenada de destino
double y; // Coordenada actual
Uint8 numJumps; // Numero de pasos preestablecido para llegar al destino
double despY; // Desplazamiento en el eje Y que realiza el selector en cada iteración. (target - origin) / numJumps
bool moving; // Indica si el selector está avanzando hacia el destino
Uint8 index; // Elemento del menu que tiene el foco
rectangle rect; // Rectangulo del selectur
Uint8 itemR; // Color para el texto seleccionado. Rojo
Uint8 itemG; // Color para el texto seleccionado. Verde
Uint8 itemB; // Color para el texto seleccionado. Azul
};
selector mSelector;
};
#endif