forked from jaildesigner-jailgames/jaildoctors_dilemma
196 lines
6.7 KiB
C++
196 lines
6.7 KiB
C++
#pragma once
|
|
#include "ifdefs.h"
|
|
#include "sprite.h"
|
|
#include "text.h"
|
|
#include "input.h"
|
|
#include "jail_audio.h"
|
|
|
|
#ifndef MENU_H
|
|
#define MENU_H
|
|
|
|
#define MENU_MAX_ITEMS 50
|
|
|
|
// Clase menu
|
|
class Menu
|
|
{
|
|
private:
|
|
std::string mName; // Nombre del menu
|
|
int mPosX; // Posición en el eje X de la primera letra del primer elemento
|
|
int mPosY; // Posición en el eje Y de la primera letra del primer elemento
|
|
Uint16 mHeight; // Altura del menu
|
|
Uint16 mWidth; // Anchura del menu
|
|
Uint8 mTotalItems; // Numero total de items del menu
|
|
int mItemSelected; // Índice del item del menu que ha sido seleccionado
|
|
Uint8 mDefaultActionWhenCancel; // Indice del item del menu que se selecciona cuando se cancela el menu
|
|
Uint8 mBackgroundType; // Tipo de fondo para el menu
|
|
bool mIsCenteredOnX; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje X
|
|
bool mIsCenteredOnY; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje Y
|
|
int mCenterX; // Centro del menu en el eje X
|
|
int mCenterY; // Centro del menu en el eje Y
|
|
bool mAreElementsCenteredOnX; // Variable para saber si los elementos van centrados en el eje X
|
|
Uint16 mWidestItem; // Anchura del elemento más ancho
|
|
JA_Sound mSoundAccept; // Sonido al aceptar o elegir una opción del menu
|
|
JA_Sound mSoundCancel; // Sonido al cancelar el menu
|
|
JA_Sound mSoundMove; // Sonido al mover el selector
|
|
SDL_Renderer *mRenderer; // Puntero al renderizador de la ventana
|
|
std::string *mFileList; // Lista de ficheros
|
|
Text *mText; // Texto para poder escribir los items del menu
|
|
Input *mInput; // Gestor de eventos de entrada de teclado o gamepad
|
|
color_t mColorGreyed; // Color para los elementos agrisados
|
|
|
|
struct rectangle
|
|
{
|
|
SDL_Rect rect; // Rectangulo
|
|
Uint8 r; // Rojo
|
|
Uint8 g; // Verde
|
|
Uint8 b; // Azul
|
|
Uint8 a; // Transparencia
|
|
};
|
|
rectangle mRectBG; // Rectangulo de fondo del menu
|
|
|
|
struct item
|
|
{
|
|
std::string label; // Texto
|
|
SDL_Rect rect; // Rectangulo que delimita el elemento
|
|
Uint8 hPaddingDown; // Espaciado bajo el elemento
|
|
bool selectable; // Indica si se puede seleccionar
|
|
bool greyed; // Indica si ha de aparecer con otro color mas oscuro
|
|
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 mItem[MENU_MAX_ITEMS]; // Estructura para cada elemento del menu
|
|
|
|
struct selector
|
|
{
|
|
float originY; // Coordenada de origen
|
|
float targetY; // Coordenada de destino
|
|
float despY; // Cantidad de pixeles que se desplaza el selector en cada salto: (target - origin) / numJumps
|
|
bool moving; // Indica si el selector está avanzando hacia el destino
|
|
float originH; // Altura de origen
|
|
float targetH; // Altura de destino
|
|
float incH; // Cantidad de pixels que debe incrementar o decrementar el selector en cada salto
|
|
bool resizing; // Indica si el selector está cambiando de tamaño
|
|
float y; // Coordenada actual, usado para el desplazamiento
|
|
float h; // Altura actual, usado para el cambio de tamaño
|
|
Uint8 numJumps; // Numero de pasos preestablecido para llegar al destino
|
|
Uint8 index; // Elemento del menu que tiene el foco
|
|
SDL_Rect rect; // Rectangulo del selector
|
|
Uint8 r; // Cantidad de color rojo para el rectangulo del selector
|
|
Uint8 g; // Cantidad de color verde para el rectangulo del selector
|
|
Uint8 b; // Cantidad de color azul para el rectangulo del selector
|
|
Uint8 a; // Cantidad de transparencia para el rectangulo del selector
|
|
Uint8 itemR; // Cantidad de color rojo para el texto del elemento seleccionado
|
|
Uint8 itemG; // Cantidad de color verde para el texto del elemento seleccionado
|
|
Uint8 itemB; // Cantidad de color azul para el texto del elemento seleccionado
|
|
};
|
|
selector mSelector; // 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();
|
|
|
|
// 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();
|
|
|
|
// Actualiza la posicion y el estado del selector
|
|
void updateSelector();
|
|
|
|
// Obtiene la anchura del elemento más ancho del menu
|
|
Uint16 getWidestItem();
|
|
|
|
// Gestiona la entrada de teclado y mando durante el menu
|
|
void checkMenuInput(Menu *menu);
|
|
|
|
// Calcula el ancho del menu
|
|
Uint16 findWidth();
|
|
|
|
// Calcula el alto del menu
|
|
Uint16 findHeight();
|
|
|
|
// Recoloca los elementos del menu en el eje Y
|
|
void replaceElementsOnY();
|
|
|
|
// Calcula la altura del selector
|
|
int getSelectorHeight(int value);
|
|
|
|
public:
|
|
// Constructor
|
|
Menu(SDL_Renderer *renderer, Text *text, Input *input, std::string *fileList);
|
|
|
|
// Destructor
|
|
~Menu();
|
|
|
|
// Inicializador
|
|
void init(std::string name, int x, int y, int backgroundType);
|
|
|
|
// 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();
|
|
|
|
// Gestiona la entrada de teclado y mando durante el menu
|
|
void checkInput();
|
|
|
|
// 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 en el eje X
|
|
void centerMenuOnX(int value);
|
|
|
|
// Centra el menu respecto a un punto en el eje Y
|
|
void centerMenuOnY(int value);
|
|
|
|
// Centra los elementos del menu en el eje X
|
|
void centerMenuElementsOnX();
|
|
|
|
// Añade un item al menu
|
|
void addItem(std::string text, Uint8 hPaddingDown = 1, bool selectable = true, bool greyed = false, bool linkedDown = false);
|
|
|
|
// 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);
|
|
|
|
// Coloca el selector en una posición específica
|
|
void setSelectorPos(Uint8 index);
|
|
|
|
// Establece el estado seleccionable de un item
|
|
void setSelectable(Uint8 index, bool value);
|
|
|
|
// Establece el estado agrisado de un item
|
|
void setGreyed(Uint8 index, bool value);
|
|
|
|
// Establece el estado de enlace de un item
|
|
void setLinkedDown(Uint8 index, bool value);
|
|
};
|
|
|
|
#endif
|