#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 { SDL_Rect rect; // Rectangulo 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; // (target - origin) / numJumps bool moving; // Indica si el selector está avanzando hacia el destino Uint8 index; // Elemento del menu que tiene el foco SDL_Rect rect; // Rectangulo para dibujar el selector Uint8 r; // Color para el selector. Rojo Uint8 g; // Color para el selector. Verde Uint8 b; // Color para el selector. Azul Uint8 a; // Color para el selector. Transparencia 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