treball en curs: correccions de tidy
This commit is contained in:
+157
-331
@@ -21,36 +21,47 @@ class Texture;
|
||||
struct JA_Music_t;
|
||||
struct JA_Sound_t;
|
||||
|
||||
// Cantidad de elementos a escribir en los ficheros de datos
|
||||
constexpr int TOTAL_SCORE_DATA = 3;
|
||||
constexpr int TOTAL_DEMO_DATA = 2000;
|
||||
|
||||
// Contadores
|
||||
constexpr int STAGE_COUNTER = 200;
|
||||
constexpr int SHAKE_COUNTER = 10;
|
||||
constexpr int HELP_COUNTER = 1000;
|
||||
constexpr int GAME_COMPLETED_START_FADE = 500;
|
||||
constexpr int GAME_COMPLETED_END = 700;
|
||||
|
||||
// Formaciones enemigas
|
||||
constexpr int NUMBER_OF_ENEMY_FORMATIONS = 100;
|
||||
constexpr int MAX_NUMBER_OF_ENEMIES_IN_A_FORMATION = 50;
|
||||
|
||||
// Porcentaje de aparición de los objetos
|
||||
constexpr int ITEM_POINTS_1_DISK_ODDS = 10;
|
||||
constexpr int ITEM_POINTS_2_GAVINA_ODDS = 6;
|
||||
constexpr int ITEM_POINTS_3_PACMAR_ODDS = 3;
|
||||
constexpr int ITEM_CLOCK_ODDS = 5;
|
||||
constexpr int ITEM_COFFEE_ODDS = 5;
|
||||
constexpr int ITEM_POWER_BALL_ODDS = 0;
|
||||
constexpr int ITEM_COFFEE_MACHINE_ODDS = 4;
|
||||
|
||||
// Valores para las variables asociadas a los objetos
|
||||
constexpr int TIME_STOPPED_COUNTER = 300;
|
||||
|
||||
// Clase Game
|
||||
class Game {
|
||||
public:
|
||||
Game(int num_players, int current_stage, SDL_Renderer *renderer, bool demo, Section *section); // Constructor
|
||||
~Game(); // Destructor
|
||||
|
||||
Game(const Game &) = delete;
|
||||
auto operator=(const Game &) -> Game & = delete;
|
||||
|
||||
void run(); // Bucle para el juego
|
||||
void iterate(); // Ejecuta un frame del juego
|
||||
[[nodiscard]] auto hasFinished() const -> bool; // Indica si el juego ha terminado
|
||||
void handleEvent(const SDL_Event *event); // Procesa un evento
|
||||
|
||||
private:
|
||||
// Cantidad de elementos a escribir en los ficheros de datos
|
||||
static constexpr int TOTAL_SCORE_DATA = 3;
|
||||
static constexpr int TOTAL_DEMO_DATA = 2000;
|
||||
|
||||
// Contadores
|
||||
static constexpr int STAGE_COUNTER = 200;
|
||||
static constexpr int SHAKE_COUNTER = 10;
|
||||
static constexpr int HELP_COUNTER = 1000;
|
||||
static constexpr int GAME_COMPLETED_START_FADE = 500;
|
||||
static constexpr int GAME_COMPLETED_END = 700;
|
||||
|
||||
// Formaciones enemigas
|
||||
static constexpr int NUMBER_OF_ENEMY_FORMATIONS = 100;
|
||||
static constexpr int MAX_NUMBER_OF_ENEMIES_IN_A_FORMATION = 50;
|
||||
|
||||
// Porcentaje de aparición de los objetos
|
||||
static constexpr int ITEM_POINTS_1_DISK_ODDS = 10;
|
||||
static constexpr int ITEM_POINTS_2_GAVINA_ODDS = 6;
|
||||
static constexpr int ITEM_POINTS_3_PACMAR_ODDS = 3;
|
||||
static constexpr int ITEM_CLOCK_ODDS = 5;
|
||||
static constexpr int ITEM_COFFEE_ODDS = 5;
|
||||
static constexpr int ITEM_COFFEE_MACHINE_ODDS = 4;
|
||||
|
||||
// Valores para las variables asociadas a los objetos
|
||||
static constexpr int TIME_STOPPED_COUNTER = 300;
|
||||
|
||||
struct EnemyInit {
|
||||
int x; // Posición en el eje X donde crear al enemigo
|
||||
int y; // Posición en el eje Y donde crear al enemigo
|
||||
@@ -128,6 +139,125 @@ class Game {
|
||||
DemoKeys data_file[TOTAL_DEMO_DATA]; // Datos del fichero con los movimientos para la demo
|
||||
};
|
||||
|
||||
void update(); // Actualiza el juego
|
||||
void render(); // Dibuja el juego
|
||||
void init(); // Inicializa las variables necesarias para la sección 'Game'
|
||||
void loadMedia(); // Carga los recursos necesarios para la sección 'Game'
|
||||
|
||||
auto loadScoreFile() -> bool; // Carga el fichero de puntos
|
||||
auto loadDemoFile() -> bool; // Carga el fichero de datos para la demo
|
||||
auto saveScoreFile() -> bool; // Guarda el fichero de puntos
|
||||
auto saveDemoFile() -> bool; // Guarda el fichero de datos para la demo
|
||||
|
||||
void initEnemyFormations(); // Inicializa las formaciones enemigas
|
||||
void initEnemyFormationsZero(); // Helper de initEnemyFormations
|
||||
void initEnemyFormationsLinear(); // Helper de initEnemyFormations
|
||||
void initEnemyFormationsSymmetric(); // Helper de initEnemyFormations
|
||||
void initEnemyFormationsHexagonsAndTest(); // Helper de initEnemyFormations
|
||||
|
||||
void initEnemyPools(); // Inicializa los conjuntos de formaciones
|
||||
void initGameStages(); // Inicializa las fases del juego
|
||||
void deployEnemyFormation(); // Crea una formación de enemigos
|
||||
void increaseStageCurrentPower(Uint8 power); // Aumenta el poder de la fase
|
||||
|
||||
void setHiScore(Uint32 score); // Establece el valor de la variable
|
||||
void updateHiScore(); // Actualiza el valor de HiScore en caso necesario
|
||||
static auto updateScoreText(Uint32 num) -> std::string; // Transforma un valor numérico en una cadena de 6 cifras
|
||||
void renderScoreBoard(); // Pinta el marcador en pantalla usando un objeto texto
|
||||
|
||||
void updatePlayers(); // Actualiza las variables del jugador
|
||||
void renderPlayers(); // Dibuja a los jugadores
|
||||
|
||||
void updateStage(); // Actualiza las variables de la fase
|
||||
void updateDeath(); // Actualiza el estado de muerte
|
||||
void renderDeathFade(int counter); // Renderiza el fade final cuando se acaba la partida
|
||||
|
||||
void updateBalloons(); // Actualiza los globos
|
||||
void renderBalloons(); // Pinta en pantalla todos los globos activos
|
||||
auto createBalloon(float x, float y, Uint8 kind, float velx, float speed, Uint16 creationtimer) -> Uint8; // Crea un globo nuevo en el vector de globos
|
||||
void createPowerBall(); // Crea una PowerBall
|
||||
void setBalloonSpeed(float speed); // Establece la velocidad de los globos
|
||||
void incBalloonSpeed(); // Incrementa la velocidad de los globos
|
||||
void updateBalloonSpeed(); // Actualiza la velocidad de los globos en funcion del poder acumulado de la fase
|
||||
void popBalloon(Balloon *balloon); // Explosiona un globo. Lo destruye y crea otros dos si es el caso
|
||||
void destroyBalloon(Balloon *balloon); // Explosiona un globo. Lo destruye
|
||||
void destroyAllBalloons(); // Destruye todos los globos
|
||||
void stopAllBalloons(Uint16 time); // Detiene todos los globos
|
||||
void startAllBalloons(); // Pone en marcha todos los globos
|
||||
void freeBalloons(); // Vacia el vector de globos
|
||||
|
||||
auto checkPlayerBalloonCollision(Player *player) -> bool; // Comprueba la colisión entre el jugador y los globos activos
|
||||
void checkPlayerItemCollision(Player *player); // Comprueba la colisión entre el jugador y los items
|
||||
void checkBulletBalloonCollision(); // Comprueba la colisión entre las balas y los globos
|
||||
void resolveBulletBalloonHit(Bullet *bullet, Balloon *balloon); // Resuelve un impacto bala-globo (helper de checkBulletBalloonCollision)
|
||||
|
||||
void moveBullets(); // Mueve las balas activas
|
||||
void renderBullets(); // Pinta las balas activas
|
||||
void createBullet(int x, int y, Bullet::Kind kind, bool powered_up, int owner); // Crea un objeto bala
|
||||
void freeBullets(); // Vacia el vector de balas
|
||||
|
||||
void updateItems(); // Actualiza los items
|
||||
void renderItems(); // Pinta los items activos
|
||||
auto dropItem() -> Item::Id; // Devuelve un item en función del azar
|
||||
void createItem(Item::Id kind, float x, float y); // Crea un objeto item
|
||||
void freeItems(); // Vacia el vector de items
|
||||
|
||||
void createItemScoreSprite(int x, int y, const SmartSprite *sprite); // Crea un objeto SmartSprite
|
||||
void freeSmartSprites(); // Vacia el vector de smartsprites
|
||||
|
||||
void renderFlashEffect(); // Dibuja el efecto de flash
|
||||
void updateShakeEffect(); // Actualiza el efecto de agitar la pantalla
|
||||
void throwCoffee(int x, int y); // Crea un SmartSprite para arrojar el item café al recibir un impacto
|
||||
void updateSmartSprites(); // Actualiza los SmartSprites
|
||||
void renderSmartSprites(); // Pinta los SmartSprites activos
|
||||
|
||||
void killPlayer(Player *player); // Acciones a realizar cuando el jugador muere
|
||||
void evaluateAndSetMenace(); // Calcula y establece el valor de amenaza en funcion de los globos activos
|
||||
[[nodiscard]] auto getMenace() const -> Uint8; // Obtiene el valor de la variable
|
||||
|
||||
void setTimeStopped(bool value); // Establece el valor de la variable
|
||||
[[nodiscard]] auto isTimeStopped() const -> bool; // Obtiene el valor de la variable
|
||||
void setTimeStoppedCounter(Uint16 value); // Establece el valor de la variable
|
||||
void incTimeStoppedCounter(Uint16 value); // Incrementa el valor de la variable
|
||||
|
||||
void updateEnemyDeployCounter(); // Actualiza la variable EnemyDeployCounter
|
||||
void updateTimeStoppedCounter(); // Actualiza y comprueba el valor de la variable
|
||||
void updateMenace(); // Gestiona el nivel de amenaza
|
||||
void updateBackground(); // Actualiza el fondo
|
||||
void renderBackground(); // Dibuja el fondo
|
||||
|
||||
void checkGameInput(); // Gestiona la entrada durante el juego
|
||||
void processDemoInput(); // Helper de checkGameInput
|
||||
void processLiveInput(); // Helper de checkGameInput
|
||||
void processPlayerLiveInput(Player *player, int i); // Helper de checkGameInput
|
||||
|
||||
void renderMessages(); // Pinta diferentes mensajes en la pantalla
|
||||
void enableTimeStopItem(); // Habilita el efecto del item de detener el tiempo
|
||||
void disableTimeStopItem(); // Deshabilita el efecto del item de detener el tiempo
|
||||
void shakeScreen(); // Inicia el efecto de agitación intensa de la pantalla
|
||||
void updateDeathShake(); // Actualiza el efecto de agitación intensa
|
||||
[[nodiscard]] auto isDeathShaking() const -> bool; // Indica si el efecto de agitación intensa está activo
|
||||
void updateDeathSequence(); // Actualiza la secuencia de muerte del jugador
|
||||
|
||||
void updatePausedGame(); // Actualiza las variables del menu de pausa del juego
|
||||
void updateLeavingPauseMenu(); // Helper de updatePausedGame
|
||||
void updatePauseMenuUI(); // Helper de updatePausedGame
|
||||
void renderPausedGame(); // Dibuja el menu de pausa del juego
|
||||
void enterPausedGame(); // Inicializa el estado de pausa del juego
|
||||
|
||||
void updateGameOverScreen(); // Actualiza los elementos de la pantalla de game over
|
||||
void renderGameOverScreen(); // Dibuja los elementos de la pantalla de game over
|
||||
void enterGameOverScreen(); // Inicializa el estado de game over
|
||||
|
||||
auto canPowerBallBeCreated() -> bool; // Indica si se puede crear una powerball
|
||||
auto calculateScreenPower() -> int; // Calcula el poder actual de los globos en pantalla
|
||||
void initPaths(); // Inicializa las variables que contienen puntos de ruta para mover objetos
|
||||
void updateGameCompleted(); // Actualiza el tramo final de juego, una vez completado
|
||||
void updateHelper(); // Actualiza las variables de ayuda
|
||||
auto allPlayersAreDead() -> bool; // Comprueba si todos los jugadores han muerto
|
||||
void deleteAllVectorObjects(); // Elimina todos los objetos contenidos en vectores
|
||||
void setHiScore(); // Establece la máxima puntuación desde fichero o desde las puntuaciones online
|
||||
|
||||
// Objetos y punteros
|
||||
SDL_Renderer *renderer_; // El renderizador de la ventana
|
||||
Section *section_; // Seccion actual dentro del juego
|
||||
@@ -255,308 +385,4 @@ class Game {
|
||||
#ifdef PAUSE
|
||||
bool pause;
|
||||
#endif
|
||||
|
||||
// Actualiza el juego
|
||||
void update();
|
||||
|
||||
// Dibuja el juego
|
||||
void render();
|
||||
|
||||
// Inicializa las variables necesarias para la sección 'Game'
|
||||
void init();
|
||||
|
||||
// Carga los recursos necesarios para la sección 'Game'
|
||||
void loadMedia();
|
||||
|
||||
// Carga el fichero de puntos
|
||||
auto loadScoreFile() -> bool;
|
||||
|
||||
// Carga el fichero de datos para la demo
|
||||
auto loadDemoFile() -> bool;
|
||||
|
||||
// Guarda el fichero de puntos
|
||||
auto saveScoreFile() -> bool;
|
||||
|
||||
// Guarda el fichero de datos para la demo
|
||||
auto saveDemoFile() -> bool;
|
||||
|
||||
// Inicializa las formaciones enemigas
|
||||
void initEnemyFormations();
|
||||
|
||||
// Helpers de initEnemyFormations
|
||||
void initEnemyFormationsZero();
|
||||
void initEnemyFormationsLinear();
|
||||
void initEnemyFormationsSymmetric();
|
||||
void initEnemyFormationsHexagonsAndTest();
|
||||
|
||||
// Inicializa los conjuntos de formaciones
|
||||
void initEnemyPools();
|
||||
|
||||
// Inicializa las fases del juego
|
||||
void initGameStages();
|
||||
|
||||
// Crea una formación de enemigos
|
||||
void deployEnemyFormation();
|
||||
|
||||
// Aumenta el poder de la fase
|
||||
void increaseStageCurrentPower(Uint8 power);
|
||||
|
||||
// Establece el valor de la variable
|
||||
void setHiScore(Uint32 score);
|
||||
|
||||
// Actualiza el valor de HiScore en caso necesario
|
||||
void updateHiScore();
|
||||
|
||||
// Transforma un valor numérico en una cadena de 6 cifras
|
||||
static auto updateScoreText(Uint32 num) -> std::string;
|
||||
|
||||
// Pinta el marcador en pantalla usando un objeto texto
|
||||
void renderScoreBoard();
|
||||
|
||||
// Actualiza las variables del jugador
|
||||
void updatePlayers();
|
||||
|
||||
// Dibuja a los jugadores
|
||||
void renderPlayers();
|
||||
|
||||
// Actualiza las variables de la fase
|
||||
void updateStage();
|
||||
|
||||
// Actualiza el estado de muerte
|
||||
void updateDeath();
|
||||
|
||||
// Renderiza el fade final cuando se acaba la partida
|
||||
void renderDeathFade(int counter);
|
||||
|
||||
// Actualiza los globos
|
||||
void updateBalloons();
|
||||
|
||||
// Pinta en pantalla todos los globos activos
|
||||
void renderBalloons();
|
||||
|
||||
// Crea un globo nuevo en el vector de globos
|
||||
auto createBalloon(float x, float y, Uint8 kind, float velx, float speed, Uint16 creationtimer) -> Uint8;
|
||||
|
||||
// Crea una PowerBall
|
||||
void createPowerBall();
|
||||
|
||||
// Establece la velocidad de los globos
|
||||
void setBalloonSpeed(float speed);
|
||||
|
||||
// Incrementa la velocidad de los globos
|
||||
void incBalloonSpeed();
|
||||
|
||||
// Actualiza la velocidad de los globos en funcion del poder acumulado de la fase
|
||||
void updateBalloonSpeed();
|
||||
|
||||
// Explosiona un globo. Lo destruye y crea otros dos si es el caso
|
||||
void popBalloon(Balloon *balloon);
|
||||
|
||||
// Explosiona un globo. Lo destruye
|
||||
void destroyBalloon(Balloon *balloon);
|
||||
|
||||
// Destruye todos los globos
|
||||
void destroyAllBalloons();
|
||||
|
||||
// Detiene todos los globos
|
||||
void stopAllBalloons(Uint16 time);
|
||||
|
||||
// Pone en marcha todos los globos
|
||||
void startAllBalloons();
|
||||
|
||||
// Vacia el vector de globos
|
||||
void freeBalloons();
|
||||
|
||||
// Comprueba la colisión entre el jugador y los globos activos
|
||||
auto checkPlayerBalloonCollision(Player *player) -> bool;
|
||||
|
||||
// Comprueba la colisión entre el jugador y los items
|
||||
void checkPlayerItemCollision(Player *player);
|
||||
|
||||
// Comprueba la colisión entre las balas y los globos
|
||||
void checkBulletBalloonCollision();
|
||||
|
||||
// Resuelve un impacto bala-globo (helper de checkBulletBalloonCollision)
|
||||
void resolveBulletBalloonHit(Bullet *bullet, Balloon *balloon);
|
||||
|
||||
// Mueve las balas activas
|
||||
void moveBullets();
|
||||
|
||||
// Pinta las balas activas
|
||||
void renderBullets();
|
||||
|
||||
// Crea un objeto bala
|
||||
void createBullet(int x, int y, Bullet::Kind kind, bool powered_up, int owner);
|
||||
|
||||
// Vacia el vector de balas
|
||||
void freeBullets();
|
||||
|
||||
// Actualiza los items
|
||||
void updateItems();
|
||||
|
||||
// Pinta los items activos
|
||||
void renderItems();
|
||||
|
||||
// Devuelve un item en función del azar
|
||||
auto dropItem() -> Item::Id;
|
||||
|
||||
// Crea un objeto item
|
||||
void createItem(Item::Id kind, float x, float y);
|
||||
|
||||
// Vacia el vector de items
|
||||
void freeItems();
|
||||
|
||||
// Crea un objeto SmartSprite
|
||||
void createItemScoreSprite(int x, int y, const SmartSprite *sprite);
|
||||
|
||||
// Vacia el vector de smartsprites
|
||||
void freeSmartSprites();
|
||||
|
||||
// Dibuja el efecto de flash
|
||||
void renderFlashEffect();
|
||||
|
||||
// Actualiza el efecto de agitar la pantalla
|
||||
void updateShakeEffect();
|
||||
|
||||
// Crea un SmartSprite para arrojar el item café al recibir un impacto
|
||||
void throwCoffee(int x, int y);
|
||||
|
||||
// Actualiza los SmartSprites
|
||||
void updateSmartSprites();
|
||||
|
||||
// Pinta los SmartSprites activos
|
||||
void renderSmartSprites();
|
||||
|
||||
// Acciones a realizar cuando el jugador muere
|
||||
void killPlayer(Player *player);
|
||||
|
||||
// Calcula y establece el valor de amenaza en funcion de los globos activos
|
||||
void evaluateAndSetMenace();
|
||||
|
||||
// Obtiene el valor de la variable
|
||||
[[nodiscard]] auto getMenace() const -> Uint8;
|
||||
|
||||
// Establece el valor de la variable
|
||||
void setTimeStopped(bool value);
|
||||
|
||||
// Obtiene el valor de la variable
|
||||
[[nodiscard]] auto isTimeStopped() const -> bool;
|
||||
|
||||
// Establece el valor de la variable
|
||||
void setTimeStoppedCounter(Uint16 value);
|
||||
|
||||
// Incrementa el valor de la variable
|
||||
void incTimeStoppedCounter(Uint16 value);
|
||||
|
||||
// Actualiza la variable EnemyDeployCounter
|
||||
void updateEnemyDeployCounter();
|
||||
|
||||
// Actualiza y comprueba el valor de la variable
|
||||
void updateTimeStoppedCounter();
|
||||
|
||||
// Gestiona el nivel de amenaza
|
||||
void updateMenace();
|
||||
|
||||
// Actualiza el fondo
|
||||
void updateBackground();
|
||||
|
||||
// Dibuja el fondo
|
||||
void renderBackground();
|
||||
|
||||
// Gestiona la entrada durante el juego
|
||||
void checkGameInput();
|
||||
|
||||
// Helpers de checkGameInput
|
||||
void processDemoInput();
|
||||
void processLiveInput();
|
||||
void processPlayerLiveInput(Player *player, int i);
|
||||
|
||||
// Pinta diferentes mensajes en la pantalla
|
||||
void renderMessages();
|
||||
|
||||
// Habilita el efecto del item de detener el tiempo
|
||||
void enableTimeStopItem();
|
||||
|
||||
// Deshabilita el efecto del item de detener el tiempo
|
||||
void disableTimeStopItem();
|
||||
|
||||
// Inicia el efecto de agitación intensa de la pantalla
|
||||
void shakeScreen();
|
||||
|
||||
// Actualiza el efecto de agitación intensa
|
||||
void updateDeathShake();
|
||||
|
||||
// Indica si el efecto de agitación intensa está activo
|
||||
[[nodiscard]] auto isDeathShaking() const -> bool;
|
||||
|
||||
// Actualiza la secuencia de muerte del jugador
|
||||
void updateDeathSequence();
|
||||
|
||||
// Actualiza las variables del menu de pausa del juego
|
||||
void updatePausedGame();
|
||||
|
||||
// Helpers de updatePausedGame
|
||||
void updateLeavingPauseMenu();
|
||||
void updatePauseMenuUI();
|
||||
|
||||
// Dibuja el menu de pausa del juego
|
||||
void renderPausedGame();
|
||||
|
||||
// Inicializa el estado de pausa del juego
|
||||
void enterPausedGame();
|
||||
|
||||
// Actualiza los elementos de la pantalla de game over
|
||||
void updateGameOverScreen();
|
||||
|
||||
// Dibuja los elementos de la pantalla de game over
|
||||
void renderGameOverScreen();
|
||||
|
||||
// Inicializa el estado de game over
|
||||
void enterGameOverScreen();
|
||||
|
||||
// Indica si se puede crear una powerball
|
||||
auto canPowerBallBeCreated() -> bool;
|
||||
|
||||
// Calcula el poder actual de los globos en pantalla
|
||||
auto calculateScreenPower() -> int;
|
||||
|
||||
// Inicializa las variables que contienen puntos de ruta para mover objetos
|
||||
void initPaths();
|
||||
|
||||
// Actualiza el tramo final de juego, una vez completado
|
||||
void updateGameCompleted();
|
||||
|
||||
// Actualiza las variables de ayuda
|
||||
void updateHelper();
|
||||
|
||||
// Comprueba si todos los jugadores han muerto
|
||||
auto allPlayersAreDead() -> bool;
|
||||
|
||||
// Elimina todos los objetos contenidos en vectores
|
||||
void deleteAllVectorObjects();
|
||||
|
||||
// Establece la máxima puntuación desde fichero o desde las puntuaciones online
|
||||
void setHiScore();
|
||||
|
||||
public:
|
||||
// Constructor
|
||||
Game(int num_players, int current_stage, SDL_Renderer *renderer, bool demo, Section *section);
|
||||
|
||||
// Destructor
|
||||
~Game();
|
||||
|
||||
Game(const Game &) = delete;
|
||||
auto operator=(const Game &) -> Game & = delete;
|
||||
|
||||
// Bucle para el juego
|
||||
void run();
|
||||
|
||||
// Ejecuta un frame del juego
|
||||
void iterate();
|
||||
|
||||
// Indica si el juego ha terminado
|
||||
[[nodiscard]] auto hasFinished() const -> bool;
|
||||
|
||||
// Procesa un evento
|
||||
void handleEvent(const SDL_Event *event);
|
||||
};
|
||||
|
||||
+285
-285
File diff suppressed because it is too large
Load Diff
+104
-182
@@ -24,6 +24,56 @@ constexpr int MENU_NO_OPTION = -1;
|
||||
|
||||
// Clase Menu
|
||||
class Menu {
|
||||
public:
|
||||
explicit Menu(SDL_Renderer *renderer, const std::string &file = ""); // Constructor
|
||||
~Menu(); // Destructor
|
||||
|
||||
auto loadFromBytes(const std::vector<uint8_t> &bytes, const std::string &name_for_logs = "") -> bool; // Carga el menu desde bytes en memoria
|
||||
void loadAudioFile(const std::string &file, int sound); // Carga los ficheros de audio
|
||||
|
||||
[[nodiscard]] auto getName() const -> const std::string &; // Obtiene el nombre del menu
|
||||
auto getItemSelected() -> int; // Obtiene el valor de la variable
|
||||
|
||||
void reset(); // Deja el menu apuntando al primer elemento
|
||||
void checkInput(); // Gestiona la entrada de teclado y mando durante el menu
|
||||
void update(); // Actualiza la logica del menu
|
||||
void render(); // Pinta el menu en pantalla
|
||||
|
||||
void setBackgroundColor(Color color, int alpha); // Establece el color del rectangulo de fondo
|
||||
void setSelectorColor(Color color, int alpha); // Establece el color del rectangulo del selector
|
||||
void setSelectorTextColor(Color color); // Establece el color del texto del selector
|
||||
|
||||
void centerMenuOnX(int value = 0); // Centra el menu respecto a un punto en el eje X
|
||||
void centerMenuOnY(int value); // Centra el menu respecto a un punto en el eje Y
|
||||
void centerMenuElementsOnX(); // Centra los elementos del menu en el eje X
|
||||
|
||||
struct Item {
|
||||
std::string label; // Texto
|
||||
SDL_Rect rect; // Rectangulo que delimita el elemento
|
||||
int h_padding_down; // Espaciado bajo el elemento
|
||||
bool selectable; // Indica si se puede seleccionar
|
||||
bool greyed; // Indica si ha de aparecer con otro color mas oscuro
|
||||
bool linked_down; // Indica si el elemento actual y el siguiente se tratan como uno solo. Afecta al selector
|
||||
bool linked_up; // Indica si el elemento actual y el anterior se tratan como uno solo. Afecta al selector
|
||||
bool visible; // Indica si el elemento es visible
|
||||
bool line; // Indica si el elemento lleva una linea a continuación
|
||||
};
|
||||
|
||||
void addItem(Item new_item); // Añade un item al menu
|
||||
void setItemCaption(int index, const std::string &text); // Cambia el texto de un item
|
||||
void setDefaultActionWhenCancel(int item); // Establece el indice del item que se usará por defecto al cancelar el menu
|
||||
void setSelectorPos(int index); // Coloca el selector en una posición específica
|
||||
void setSelectable(int index, bool value); // Establece el estado seleccionable de un item
|
||||
void setGreyed(int index, bool value); // Establece el estado agrisado de un item
|
||||
void setLinkedDown(int index, bool value); // Establece el estado de enlace de un item
|
||||
void setVisible(int index, bool value); // Establece el estado de visibilidad de un item
|
||||
|
||||
void setName(const std::string &name); // Establece el nombre del menu
|
||||
void setPos(int x, int y); // Establece la posición del menu
|
||||
void setBackgroundType(int value); // Establece el tipo de fondo del menu
|
||||
void setText(const std::string &font_png, const std::string &font_txt); // Establece la fuente de texto que se utilizará
|
||||
void setRectSize(int w = 0, int h = 0); // Establece el rectangulo de fondo del menu
|
||||
|
||||
private:
|
||||
struct Rectangle {
|
||||
SDL_Rect rect; // Rectangulo
|
||||
@@ -31,200 +81,72 @@ class Menu {
|
||||
int a; // Transparencia
|
||||
};
|
||||
|
||||
struct Item {
|
||||
std::string label; // Texto
|
||||
SDL_Rect rect; // Rectangulo que delimita el elemento
|
||||
int 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
|
||||
bool visible; // Indica si el elemento es visible
|
||||
bool line; // Indica si el elemento lleva una linea a continuación
|
||||
};
|
||||
|
||||
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
|
||||
float origin_y; // Coordenada de origen
|
||||
float target_y; // Coordenada de destino
|
||||
float desp_y; // 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
|
||||
float origin_h; // Altura de origen
|
||||
float target_h; // Altura de destino
|
||||
float inc_h; // 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
|
||||
int numJumps; // Numero de pasos preestablecido para llegar al destino
|
||||
int num_jumps; // Numero de pasos preestablecido para llegar al destino
|
||||
int index; // Elemento del menu que tiene el foco
|
||||
int previousIndex; // Elemento que tenia el foco previamente
|
||||
Color previousItemColor; // Color del item nque tenia el foco previamente
|
||||
int previous_index; // Elemento que tenia el foco previamente
|
||||
Color previous_item_color; // Color del item nque tenia el foco previamente
|
||||
SDL_Rect rect; // Rectangulo del selector
|
||||
Color color; // Color del selector
|
||||
Color itemColor; // Color del item
|
||||
Color jumpItemColors[8]; // Transición de colores para el item seleccionado
|
||||
int itemColorIndex; // Indice del color de transición para el item seleccionado
|
||||
Color item_color; // Color del item
|
||||
Color jump_item_colors[8]; // Transición de colores para el item seleccionado
|
||||
int item_color_index; // Indice del color de transición para el item seleccionado
|
||||
int a; // Cantidad de transparencia para el rectangulo del selector
|
||||
};
|
||||
|
||||
auto load(const std::string &file_path) -> bool; // Carga la configuración del menu desde un archivo de texto
|
||||
auto parseFromStream(std::istream &file, const std::string &filename) -> bool; // Parser compartido (recibe cualquier istream)
|
||||
auto setVars(const std::string &var, const std::string &value) -> bool; // Asigna variables a partir de dos cadenas
|
||||
static auto setItem(Item *item, const std::string &var, const std::string &value) -> bool; // Asigna variables a partir de dos cadenas
|
||||
|
||||
void reorganize(); // Actualiza el menu para recolocarlo correctamente y establecer el tamaño
|
||||
void increaseSelectorIndex(); // Deja el menu apuntando al siguiente elemento
|
||||
void decreaseSelectorIndex(); // Deja el menu apuntando al elemento anterior
|
||||
void updateSelector(); // Actualiza la posicion y el estado del selector
|
||||
auto getWidestItem() -> int; // Obtiene la anchura del elemento más ancho del menu
|
||||
void checkMenuInput(Menu *menu); // Gestiona la entrada de teclado y mando durante el menu
|
||||
auto findWidth() -> int; // Calcula el ancho del menu
|
||||
auto findHeight() -> int; // Calcula el alto del menu
|
||||
void replaceElementsOnY(); // Recoloca los elementos del menu en el eje Y
|
||||
auto getSelectorHeight(int value) -> int; // Calcula la altura del selector
|
||||
void setSelectorItemColors(); // Calcula los colores del selector para el degradado
|
||||
|
||||
// Objetos y punteros
|
||||
SDL_Renderer *renderer; // Puntero al renderizador de la ventana
|
||||
Text *text; // Texto para poder escribir los items del menu
|
||||
SDL_Renderer *renderer_; // Puntero al renderizador de la ventana
|
||||
Text *text_; // Texto para poder escribir los items del menu
|
||||
|
||||
// Variables
|
||||
std::string name; // Nombre del menu
|
||||
int x; // Posición en el eje X 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 w; // Anchura 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
|
||||
int centerX; // Centro del menu en el eje X
|
||||
int centerY; // Centro del menu en el eje Y
|
||||
bool isCenteredOnX; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje X
|
||||
bool isCenteredOnY; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje Y
|
||||
bool areElementsCenteredOnX; // Variable para saber si los elementos van centrados en el eje X
|
||||
int widestItem; // Anchura del elemento más ancho
|
||||
JA_Sound_t *soundAccept; // Sonido al aceptar o elegir una opción del menu
|
||||
JA_Sound_t *soundCancel; // Sonido al cancelar el menu
|
||||
JA_Sound_t *soundMove; // Sonido al mover el selector
|
||||
Color colorGreyed; // Color para los elementos agrisados
|
||||
Rectangle rectBG; // Rectangulo de fondo del menu
|
||||
std::vector<Item> item; // Estructura para cada elemento del menu
|
||||
Selector selector; // Variables para pintar el selector del menu
|
||||
std::string font_png;
|
||||
std::string font_txt;
|
||||
|
||||
// Carga la configuración del menu desde un archivo de texto
|
||||
auto load(const std::string &file_path) -> bool;
|
||||
|
||||
// Parser compartido (recibe cualquier istream)
|
||||
auto parseFromStream(std::istream &file, const std::string &filename) -> bool;
|
||||
|
||||
// Asigna variables a partir de dos cadenas
|
||||
auto setVars(const std::string &var, const std::string &value) -> bool;
|
||||
|
||||
// Asigna variables a partir de dos cadenas
|
||||
static auto setItem(Item *item, const std::string &var, const std::string &value) -> bool;
|
||||
|
||||
// Actualiza el menu para recolocarlo correctamente y establecer el tamaño
|
||||
void reorganize();
|
||||
|
||||
// Deja el menu apuntando al siguiente elemento
|
||||
void increaseSelectorIndex();
|
||||
|
||||
// Deja el menu apuntando al elemento anterior
|
||||
void decreaseSelectorIndex();
|
||||
|
||||
// Actualiza la posicion y el estado del selector
|
||||
void updateSelector();
|
||||
|
||||
// Obtiene la anchura del elemento más ancho del menu
|
||||
auto getWidestItem() -> int;
|
||||
|
||||
// Gestiona la entrada de teclado y mando durante el menu
|
||||
void checkMenuInput(Menu *menu);
|
||||
|
||||
// Calcula el ancho del menu
|
||||
auto findWidth() -> int;
|
||||
|
||||
// Calcula el alto del menu
|
||||
auto findHeight() -> int;
|
||||
|
||||
// Recoloca los elementos del menu en el eje Y
|
||||
void replaceElementsOnY();
|
||||
|
||||
// Calcula la altura del selector
|
||||
auto getSelectorHeight(int value) -> int;
|
||||
|
||||
// Calcula los colores del selector para el degradado
|
||||
void setSelectorItemColors();
|
||||
|
||||
public:
|
||||
// Constructor
|
||||
explicit Menu(SDL_Renderer *renderer, const std::string &file = "");
|
||||
|
||||
// Destructor
|
||||
~Menu();
|
||||
|
||||
// Carga el menu desde bytes en memoria
|
||||
auto loadFromBytes(const std::vector<uint8_t> &bytes, const std::string &nameForLogs = "") -> bool;
|
||||
|
||||
// Carga los ficheros de audio
|
||||
void loadAudioFile(const std::string &file, int sound);
|
||||
|
||||
// Obtiene el nombre del menu
|
||||
[[nodiscard]] auto getName() const -> const std::string &;
|
||||
|
||||
// Obtiene el valor de la variable
|
||||
auto getItemSelected() -> int;
|
||||
|
||||
// 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(Color color, int alpha);
|
||||
|
||||
// Establece el color del rectangulo del selector
|
||||
void setSelectorColor(Color color, int alpha);
|
||||
|
||||
// Establece el color del texto del selector
|
||||
void setSelectorTextColor(Color color);
|
||||
|
||||
// Centra el menu respecto a un punto en el eje X
|
||||
void centerMenuOnX(int value = 0);
|
||||
|
||||
// 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(Item new_item);
|
||||
|
||||
// Cambia el texto de un item
|
||||
void setItemCaption(int index, const std::string &text);
|
||||
|
||||
// Establece el indice del item que se usará por defecto al cancelar el menu
|
||||
void setDefaultActionWhenCancel(int item);
|
||||
|
||||
// Coloca el selector en una posición específica
|
||||
void setSelectorPos(int index);
|
||||
|
||||
// Establece el estado seleccionable de un item
|
||||
void setSelectable(int index, bool value);
|
||||
|
||||
// Establece el estado agrisado de un item
|
||||
void setGreyed(int index, bool value);
|
||||
|
||||
// Establece el estado de enlace de un item
|
||||
void setLinkedDown(int index, bool value);
|
||||
|
||||
// Establece el estado de visibilidad de un item
|
||||
void setVisible(int index, bool value);
|
||||
|
||||
// Establece el nombre del menu
|
||||
void setName(const std::string &name);
|
||||
|
||||
// Establece la posición del menu
|
||||
void setPos(int x, int y);
|
||||
|
||||
// Establece el tipo de fondo del menu
|
||||
void setBackgroundType(int value);
|
||||
|
||||
// Establece la fuente de texto que se utilizará
|
||||
void setText(const std::string &font_png, const std::string &font_txt);
|
||||
|
||||
// Establece el rectangulo de fondo del menu
|
||||
void setRectSize(int w = 0, int h = 0);
|
||||
std::string name_; // Nombre del menu
|
||||
int x_; // Posición en el eje X 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 w_; // Anchura del menu
|
||||
int item_selected_; // Índice del item del menu que ha sido seleccionado
|
||||
int default_action_when_cancel_; // Indice del item del menu que se selecciona cuando se cancela el menu
|
||||
int background_type_; // Tipo de fondo para el menu
|
||||
int center_x_; // Centro del menu en el eje X
|
||||
int center_y_; // Centro del menu en el eje Y
|
||||
bool is_centered_on_x_; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje X
|
||||
bool is_centered_on_y_; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje Y
|
||||
bool are_elements_centered_on_x_; // Variable para saber si los elementos van centrados en el eje X
|
||||
int widest_item_; // Anchura del elemento más ancho
|
||||
JA_Sound_t *sound_accept_; // Sonido al aceptar o elegir una opción del menu
|
||||
JA_Sound_t *sound_cancel_; // Sonido al cancelar el menu
|
||||
JA_Sound_t *sound_move_; // Sonido al mover el selector
|
||||
Color color_greyed_; // Color para los elementos agrisados
|
||||
Rectangle rect_bg_; // Rectangulo de fondo del menu
|
||||
std::vector<Item> items_; // Estructura para cada elemento del menu
|
||||
Selector selector_; // Variables para pintar el selector del menu
|
||||
std::string font_png_;
|
||||
std::string font_txt_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user