claude: arreglos d'estil
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
Checks: >
|
||||
readability-*,
|
||||
modernize-*,
|
||||
bugprone-*,
|
||||
performance-*,
|
||||
-readability-identifier-length,
|
||||
-readability-magic-numbers
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
// Declaración adelantada
|
||||
class Texture;
|
||||
|
||||
// Estructura de Animación
|
||||
// --- Estructuras ---
|
||||
struct Animation {
|
||||
static constexpr int DEFAULT_SPEED = 5;
|
||||
|
||||
@@ -37,13 +37,13 @@ struct AnimationConfig {
|
||||
int max_tiles = 1;
|
||||
};
|
||||
|
||||
// Alias de tipo para buffer de animaciones
|
||||
using AnimationsFileBuffer = std::vector<std::string>;
|
||||
// --- Tipos ---
|
||||
using AnimationsFileBuffer = std::vector<std::string>; // Buffer de animaciones
|
||||
|
||||
// Carga las animaciones desde un fichero en un vector de strings
|
||||
auto loadAnimationsFromFile(const std::string& file_path) -> AnimationsFileBuffer;
|
||||
// --- Funciones ---
|
||||
auto loadAnimationsFromFile(const std::string& file_path) -> AnimationsFileBuffer; // Carga las animaciones desde un fichero
|
||||
|
||||
// Clase AnimatedSprite: Sprite animado que hereda de MovingSprite
|
||||
// --- Clase AnimatedSprite: sprite animado que hereda de MovingSprite ---
|
||||
class AnimatedSprite : public MovingSprite {
|
||||
public:
|
||||
// --- Constructores y destructor ---
|
||||
@@ -70,13 +70,11 @@ class AnimatedSprite : public MovingSprite {
|
||||
auto getAnimationIndex(const std::string& name) -> int; // Obtiene el índice de una animación por nombre
|
||||
|
||||
protected:
|
||||
// --- Datos de animación ---
|
||||
// --- Variables de estado ---
|
||||
std::vector<Animation> animations_; // Vector de animaciones disponibles
|
||||
std::unordered_map<std::string, int> animation_indices_; // Mapa para búsqueda rápida por nombre
|
||||
int current_animation_ = 0; // Índice de la animación activa
|
||||
|
||||
// --- Mapa para búsqueda rápida de animaciones por nombre ---
|
||||
std::unordered_map<std::string, int> animation_indices_;
|
||||
|
||||
// --- Métodos internos ---
|
||||
void animate(); // Calcula el frame correspondiente a la animación
|
||||
void loadFromAnimationsFileBuffer(const AnimationsFileBuffer& source); // Carga la animación desde un vector de cadenas
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <string> // Para string
|
||||
#include <unordered_map> // Para unordered_map
|
||||
#include <utility> // Para move
|
||||
#include <vector> // Para vector
|
||||
|
||||
// Clase Asset: gestor optimizado de recursos (singleton)
|
||||
// --- Clase Asset: gestor optimizado de recursos (singleton) ---
|
||||
class Asset {
|
||||
public:
|
||||
// Tipos de recursos
|
||||
// --- Enums ---
|
||||
enum class Type : int {
|
||||
BITMAP,
|
||||
MUSIC,
|
||||
SOUND,
|
||||
FONT,
|
||||
LANG,
|
||||
DATA,
|
||||
DEMODATA,
|
||||
ANIMATION,
|
||||
PALETTE,
|
||||
SIZE,
|
||||
BITMAP, // Imágenes
|
||||
MUSIC, // Música
|
||||
SOUND, // Sonidos
|
||||
FONT, // Fuentes
|
||||
LANG, // Idiomas
|
||||
DATA, // Datos
|
||||
DEMODATA, // Datos de demo
|
||||
ANIMATION, // Animaciones
|
||||
PALETTE, // Paletas
|
||||
SIZE, // Tamaño
|
||||
};
|
||||
|
||||
// --- Métodos de singleton ---
|
||||
@@ -38,9 +38,9 @@ class Asset {
|
||||
[[nodiscard]] auto exists(const std::string &filename) const -> bool; // Nueva función para verificar existencia
|
||||
|
||||
private:
|
||||
// --- Estructura interna para almacenar información de cada recurso ---
|
||||
// --- Estructuras privadas ---
|
||||
struct Item {
|
||||
std::string file; // Ruta completa del archivo (mantener nombre original)
|
||||
std::string file; // Ruta completa del archivo
|
||||
Type type; // Tipo de recurso
|
||||
bool required; // Indica si el archivo es obligatorio
|
||||
|
||||
@@ -49,21 +49,22 @@ class Asset {
|
||||
};
|
||||
|
||||
// --- Variables internas ---
|
||||
std::unordered_map<std::string, Item> file_list_; // Mapa para búsqueda O(1) (mantener nombre original)
|
||||
std::unordered_map<std::string, Item> file_list_; // Mapa para búsqueda O(1)
|
||||
std::string executable_path_; // Ruta del ejecutable
|
||||
|
||||
// --- Métodos internos ---
|
||||
[[nodiscard]] static auto checkFile(const std::string &path) -> bool;
|
||||
[[nodiscard]] static auto getTypeName(Type type) -> std::string;
|
||||
[[nodiscard]] static auto parseAssetType(const std::string &type_str) -> Type;
|
||||
void addToMap(const std::string &file_path, Type type, bool required, bool absolute);
|
||||
[[nodiscard]] static auto replaceVariables(const std::string &path, const std::string &prefix, const std::string &system_folder) -> std::string;
|
||||
static auto parseOptions(const std::string &options, bool &required, bool &absolute) -> void;
|
||||
[[nodiscard]] static auto checkFile(const std::string &path) -> bool; // Verifica si un archivo existe
|
||||
[[nodiscard]] static auto getTypeName(Type type) -> std::string; // Obtiene el nombre del tipo
|
||||
[[nodiscard]] static auto parseAssetType(const std::string &type_str) -> Type; // Convierte string a tipo
|
||||
void addToMap(const std::string &file_path, Type type, bool required, bool absolute); // Añade archivo al mapa
|
||||
[[nodiscard]] static auto replaceVariables(const std::string &path, const std::string &prefix, const std::string &system_folder) -> std::string; // Reemplaza variables en la ruta
|
||||
static auto parseOptions(const std::string &options, bool &required, bool &absolute) -> void; // Parsea opciones
|
||||
|
||||
// --- Patrón Singleton ---
|
||||
explicit Asset(std::string executable_path)
|
||||
// --- Constructores y destructor privados (singleton) ---
|
||||
explicit Asset(std::string executable_path) // Constructor privado
|
||||
: executable_path_(std::move(executable_path)) {}
|
||||
~Asset() = default;
|
||||
~Asset() = default; // Destructor privado
|
||||
|
||||
static Asset *instance;
|
||||
// --- Instancia singleton ---
|
||||
static Asset *instance; // Instancia única de Asset
|
||||
};
|
||||
@@ -3,19 +3,20 @@
|
||||
#include <string> // Para string
|
||||
#include <utility> // Para move
|
||||
|
||||
// Clase Audio: gestor de audio (singleton)
|
||||
// --- Clase Audio: gestor de audio (singleton) ---
|
||||
class Audio {
|
||||
public:
|
||||
// --- Enums ---
|
||||
enum class Group : int {
|
||||
ALL = -1,
|
||||
GAME = 0,
|
||||
INTERFACE = 1
|
||||
ALL = -1, // Todos los grupos
|
||||
GAME = 0, // Sonidos del juego
|
||||
INTERFACE = 1 // Sonidos de la interfaz
|
||||
};
|
||||
|
||||
// --- Constantes ---
|
||||
static constexpr int MAX_VOLUME = 100;
|
||||
static constexpr int MIN_VOLUME = 0;
|
||||
static constexpr int FREQUENCY = 48000;
|
||||
static constexpr int MAX_VOLUME = 100; // Volumen máximo
|
||||
static constexpr int MIN_VOLUME = 0; // Volumen mínimo
|
||||
static constexpr int FREQUENCY = 48000; // Frecuencia de audio
|
||||
|
||||
// --- Métodos de singleton ---
|
||||
static void init(); // Inicializa el objeto Audio
|
||||
@@ -60,12 +61,14 @@ class Audio {
|
||||
void setMusicVolume(int volume) const; // Ajustar volumen de música
|
||||
|
||||
private:
|
||||
// --- Enums privados ---
|
||||
enum class MusicState {
|
||||
PLAYING,
|
||||
PAUSED,
|
||||
STOPPED,
|
||||
PLAYING, // Reproduciendo música
|
||||
PAUSED, // Música pausada
|
||||
STOPPED, // Música detenida
|
||||
};
|
||||
|
||||
// --- Estructuras privadas ---
|
||||
struct Music {
|
||||
MusicState state; // Estado actual de la música (reproduciendo, detenido, en pausa)
|
||||
std::string name; // Última pista de música reproducida
|
||||
@@ -79,20 +82,19 @@ class Audio {
|
||||
: state(init_state), name(std::move(init_name)), loop(init_loop) {}
|
||||
};
|
||||
|
||||
Music music_;
|
||||
|
||||
// --- Variables de Estado ---
|
||||
// --- Variables de estado ---
|
||||
Music music_; // Estado de la música
|
||||
bool enabled_ = true; // Estado general del audio
|
||||
bool sound_enabled_ = true; // Estado de los efectos de sonido
|
||||
bool music_enabled_ = true; // Estado de la música
|
||||
|
||||
// --- Inicializa SDL Audio ---
|
||||
void initSDLAudio();
|
||||
// --- Métodos internos ---
|
||||
void initSDLAudio(); // Inicializa SDL Audio
|
||||
|
||||
// --- Patrón Singleton ---
|
||||
// --- Constructores y destructor privados (singleton) ---
|
||||
Audio(); // Constructor privado
|
||||
~Audio(); // Destructor privado
|
||||
|
||||
// --- Singleton ---
|
||||
static Audio *instance;
|
||||
// --- Instancia singleton ---
|
||||
static Audio *instance; // Instancia única de Audio
|
||||
};
|
||||
@@ -15,11 +15,7 @@
|
||||
|
||||
// Constructor
|
||||
Background::Background(float total_progress_to_complete)
|
||||
: total_progress_to_complete_(total_progress_to_complete),
|
||||
progress_per_stage_(total_progress_to_complete_ / STAGES),
|
||||
sun_completion_progress_(total_progress_to_complete_ * SUN_COMPLETION_FACTOR),
|
||||
|
||||
renderer_(Screen::get()->getRenderer()),
|
||||
: renderer_(Screen::get()->getRenderer()),
|
||||
|
||||
buildings_texture_(Resource::get()->getTexture("game_buildings.png")),
|
||||
top_clouds_texture_(Resource::get()->getTexture("game_clouds1.png")),
|
||||
@@ -29,6 +25,10 @@ Background::Background(float total_progress_to_complete)
|
||||
sun_texture_(Resource::get()->getTexture("game_sun.png")),
|
||||
moon_texture_(Resource::get()->getTexture("game_moon.png")),
|
||||
|
||||
total_progress_to_complete_(total_progress_to_complete),
|
||||
progress_per_stage_(total_progress_to_complete_ / STAGES),
|
||||
sun_completion_progress_(total_progress_to_complete_ * SUN_COMPLETION_FACTOR),
|
||||
|
||||
rect_(SDL_FRect{0, 0, static_cast<float>(gradients_texture_->getWidth() / 2), static_cast<float>(gradients_texture_->getHeight() / 2)}),
|
||||
src_rect_({0, 0, 320, 240}),
|
||||
dst_rect_({0, 0, 320, 240}),
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#include <array> // Para array
|
||||
#include <cstddef> // Para size_t
|
||||
#include <functional> // Para std::function
|
||||
#include <functional> // Para function
|
||||
#include <memory> // Para unique_ptr, shared_ptr
|
||||
#include <vector> // Para vector
|
||||
|
||||
@@ -14,129 +14,98 @@ class MovingSprite;
|
||||
class Sprite;
|
||||
class Texture;
|
||||
|
||||
/*
|
||||
Esta clase gestiona el fondo que aparece en la sección jugable.
|
||||
|
||||
Maneja internamente su progresión a través de diferentes estados del día/noche,
|
||||
controlando las transiciones entre gradientes, posiciones del sol/luna y velocidad de nubes.
|
||||
|
||||
Estados:
|
||||
- NORMAL: Progresión normal del día
|
||||
- COMPLETED: Reducción gradual de la actividad (nubes más lentas)
|
||||
|
||||
Métodos clave:
|
||||
- incrementProgress() -> Avanza la progresión del fondo
|
||||
- setState() -> Cambia el estado del fondo
|
||||
- setColor/setAlpha -> Efectos de atenuación
|
||||
*/
|
||||
|
||||
// --- Clase Background: gestiona el fondo de la sección jugable ---
|
||||
class Background {
|
||||
public:
|
||||
// Enumeración de estados
|
||||
// --- Enums ---
|
||||
enum class State {
|
||||
NORMAL,
|
||||
COMPLETED
|
||||
NORMAL, // Progresión normal del día
|
||||
COMPLETED // Reducción gradual de la actividad
|
||||
};
|
||||
|
||||
// Constructor y Destructor
|
||||
Background(float total_progress_to_complete = 6100.0f);
|
||||
~Background();
|
||||
// --- Tipos ---
|
||||
using ProgressCallback = std::function<void(float)>; // Callback para sincronización
|
||||
|
||||
// Actualización y renderizado
|
||||
// --- Constructor y destructor ---
|
||||
Background(float total_progress_to_complete = 6100.0f); // Constructor principal
|
||||
~Background(); // Destructor
|
||||
|
||||
// --- Métodos principales ---
|
||||
void update(); // Actualiza la lógica del objeto
|
||||
void render(); // Dibuja el objeto
|
||||
|
||||
// Configuración de posición
|
||||
void setPos(SDL_FRect pos); // Establece la posición del objeto
|
||||
|
||||
// Control de progresión
|
||||
void incrementProgress(float amount = 1.0f); // Incrementa la progresión interna
|
||||
void setProgress(float absolute_progress); // Establece la progresión absoluta
|
||||
void setState(State new_state); // Cambia el estado del fondo
|
||||
void reset(); // Reinicia la progresión
|
||||
|
||||
// Sistema de callback para sincronización automática
|
||||
using ProgressCallback = std::function<void(float)>;
|
||||
// --- Configuración ---
|
||||
void setPos(SDL_FRect pos); // Establece la posición del objeto
|
||||
void setState(State new_state); // Cambia el estado del fondo
|
||||
void setProgressCallback(ProgressCallback callback); // Establece callback para sincronización
|
||||
void removeProgressCallback(); // Elimina el callback
|
||||
|
||||
// Configuración manual (para uso fuera del juego principal)
|
||||
void setManualMode(bool manual); // Activa/desactiva el modo manual
|
||||
void setCloudsSpeed(float value); // Ajusta la velocidad de las nubes
|
||||
void setGradientNumber(int value); // Establece el degradado de fondo
|
||||
void setTransition(float value); // Ajusta la transición entre texturas
|
||||
void setSunProgression(float progress); // Establece la posición del sol
|
||||
void setMoonProgression(float progress); // Establece la posición de la luna
|
||||
|
||||
// Configuración de efectos visuales
|
||||
void setColor(Color color); // Establece el color de atenuación
|
||||
void setAlpha(int alpha); // Ajusta la transparencia del fondo
|
||||
|
||||
// Getters para información del estado
|
||||
float getProgress() const { return progress_; }
|
||||
State getState() const { return state_; }
|
||||
int getCurrentGradient() const { return static_cast<int>(gradient_number_); }
|
||||
// --- Control de progresión ---
|
||||
void incrementProgress(float amount = 1.0f); // Incrementa la progresión interna
|
||||
void setProgress(float absolute_progress); // Establece la progresión absoluta
|
||||
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto getProgress() const -> float { return progress_; } // Obtiene el progreso actual
|
||||
[[nodiscard]] auto getState() const -> State { return state_; } // Obtiene el estado actual
|
||||
[[nodiscard]] auto getCurrentGradient() const -> int { return static_cast<int>(gradient_number_); } // Obtiene el gradiente actual
|
||||
|
||||
private:
|
||||
// Constantes de configuración
|
||||
static constexpr size_t STAGES = 4;
|
||||
static constexpr float COMPLETED_REDUCTION_RATE = 25.0f;
|
||||
static constexpr float MINIMUM_COMPLETED_PROGRESS = 200.0f;
|
||||
static constexpr float SUN_COMPLETION_FACTOR = 0.5f; // El sol completa su recorrido a la mitad del progreso total
|
||||
// --- Constantes ---
|
||||
static constexpr size_t STAGES = 4; // Número de etapas
|
||||
static constexpr float COMPLETED_REDUCTION_RATE = 25.0f; // Tasa de reducción completada
|
||||
static constexpr float MINIMUM_COMPLETED_PROGRESS = 200.0f; // Progreso mínimo completado
|
||||
static constexpr float SUN_COMPLETION_FACTOR = 0.5f; // Factor de completado del sol
|
||||
|
||||
// Configuración paramétrica
|
||||
const float total_progress_to_complete_;
|
||||
const float progress_per_stage_;
|
||||
const float sun_completion_progress_;
|
||||
|
||||
// Objetos y punteros
|
||||
// --- Objetos y punteros ---
|
||||
SDL_Renderer *renderer_; // Renderizador de la ventana
|
||||
|
||||
// Texturas
|
||||
std::shared_ptr<Texture> buildings_texture_;
|
||||
std::shared_ptr<Texture> top_clouds_texture_;
|
||||
std::shared_ptr<Texture> bottom_clouds_texture_;
|
||||
std::shared_ptr<Texture> grass_texture_;
|
||||
std::shared_ptr<Texture> gradients_texture_;
|
||||
std::shared_ptr<Texture> sun_texture_;
|
||||
std::shared_ptr<Texture> moon_texture_;
|
||||
|
||||
// Sprites
|
||||
std::unique_ptr<MovingSprite> top_clouds_sprite_a_;
|
||||
std::unique_ptr<MovingSprite> top_clouds_sprite_b_;
|
||||
std::unique_ptr<MovingSprite> bottom_clouds_sprite_a_;
|
||||
std::unique_ptr<MovingSprite> bottom_clouds_sprite_b_;
|
||||
std::unique_ptr<Sprite> buildings_sprite_;
|
||||
std::unique_ptr<Sprite> gradient_sprite_;
|
||||
std::unique_ptr<Sprite> grass_sprite_;
|
||||
std::unique_ptr<Sprite> sun_sprite_;
|
||||
std::unique_ptr<Sprite> moon_sprite_;
|
||||
|
||||
// Buffers de renderizado
|
||||
SDL_Texture *canvas_; // Textura para componer el fondo
|
||||
SDL_Texture *color_texture_; // Textura para atenuar el fondo
|
||||
std::shared_ptr<Texture> buildings_texture_; // Textura de edificios
|
||||
std::shared_ptr<Texture> top_clouds_texture_; // Textura de nubes superiores
|
||||
std::shared_ptr<Texture> bottom_clouds_texture_; // Textura de nubes inferiores
|
||||
std::shared_ptr<Texture> grass_texture_; // Textura de hierba
|
||||
std::shared_ptr<Texture> gradients_texture_; // Textura de gradientes
|
||||
std::shared_ptr<Texture> sun_texture_; // Textura del sol
|
||||
std::shared_ptr<Texture> moon_texture_; // Textura de la luna
|
||||
std::unique_ptr<MovingSprite> top_clouds_sprite_a_; // Sprite de nubes superiores A
|
||||
std::unique_ptr<MovingSprite> top_clouds_sprite_b_; // Sprite de nubes superiores B
|
||||
std::unique_ptr<MovingSprite> bottom_clouds_sprite_a_; // Sprite de nubes inferiores A
|
||||
std::unique_ptr<MovingSprite> bottom_clouds_sprite_b_; // Sprite de nubes inferiores B
|
||||
std::unique_ptr<Sprite> buildings_sprite_; // Sprite de edificios
|
||||
std::unique_ptr<Sprite> gradient_sprite_; // Sprite de gradiente
|
||||
std::unique_ptr<Sprite> grass_sprite_; // Sprite de hierba
|
||||
std::unique_ptr<Sprite> sun_sprite_; // Sprite del sol
|
||||
std::unique_ptr<Sprite> moon_sprite_; // Sprite de la luna
|
||||
|
||||
// Variables de estado y progresión
|
||||
State state_ = State::NORMAL;
|
||||
float progress_ = 0.0f; // Progresión interna (0 a total_progress_to_complete_)
|
||||
bool manual_mode_ = false; // Si está en modo manual, no actualiza automáticamente
|
||||
// --- Variables de configuración ---
|
||||
const float total_progress_to_complete_; // Progreso total para completar
|
||||
const float progress_per_stage_; // Progreso por etapa
|
||||
const float sun_completion_progress_; // Progreso de completado del sol
|
||||
ProgressCallback progress_callback_; // Callback para notificar cambios de progreso
|
||||
|
||||
// Variables de renderizado
|
||||
SDL_FRect rect_; // Tamaño del objeto
|
||||
SDL_FRect src_rect_; // Parte del objeto para copiar en pantalla
|
||||
SDL_FRect dst_rect_; // Posición en pantalla donde se copia el objeto
|
||||
// --- Variables de estado ---
|
||||
std::vector<SDL_FPoint> sun_path_; // Recorrido del sol
|
||||
std::vector<SDL_FPoint> moon_path_; // Recorrido de la luna
|
||||
std::array<SDL_FRect, STAGES> gradient_rect_; // Fondos degradados
|
||||
std::array<SDL_FRect, 4> top_clouds_rect_; // Nubes superiores
|
||||
std::array<SDL_FRect, 4> bottom_clouds_rect_; // Nubes inferiores
|
||||
SDL_FRect rect_; // Tamaño del objeto
|
||||
SDL_FRect src_rect_; // Parte del objeto para copiar en pantalla
|
||||
SDL_FRect dst_rect_; // Posición en pantalla donde se copia el objeto
|
||||
Color attenuate_color_; // Color de atenuación
|
||||
|
||||
std::vector<SDL_FPoint> sun_path_; // Recorrido del sol
|
||||
std::vector<SDL_FPoint> moon_path_; // Recorrido de la luna
|
||||
|
||||
State state_ = State::NORMAL; // Estado actual
|
||||
float progress_ = 0.0f; // Progresión interna
|
||||
float clouds_speed_ = 0; // Velocidad de las nubes
|
||||
float transition_ = 0; // Porcentaje de transición
|
||||
|
||||
size_t gradient_number_ = 0; // Índice de fondo degradado
|
||||
size_t counter_ = 0; // Contador interno
|
||||
size_t alpha_color_texture_ = 0; // Transparencia de atenuación
|
||||
@@ -144,10 +113,10 @@ class Background {
|
||||
size_t sun_index_ = 0; // Índice del recorrido del sol
|
||||
size_t moon_index_ = 0; // Índice del recorrido de la luna
|
||||
int base_ = 0; // Posición base del fondo
|
||||
|
||||
Uint8 alpha_ = 0; // Transparencia entre fases
|
||||
bool manual_mode_ = false; // Si está en modo manual
|
||||
|
||||
// Métodos internos
|
||||
// --- Métodos internos ---
|
||||
void initializePaths(); // Inicializa las rutas del sol y la luna
|
||||
void initializeRects(); // Inicializa los rectángulos de gradientes y nubes
|
||||
void initializeSprites(); // Crea los sprites
|
||||
|
||||
@@ -38,17 +38,18 @@ class Balloon {
|
||||
static constexpr int POWERBALL_SCREENPOWER_MINIMUM = 10;
|
||||
static constexpr int POWERBALL_COUNTER = 8;
|
||||
|
||||
// --- Enums ---
|
||||
enum class Size : Uint8 {
|
||||
SMALL = 0,
|
||||
MEDIUM = 1,
|
||||
LARGE = 2,
|
||||
EXTRALARGE = 3,
|
||||
SMALL = 0, // Tamaño pequeño
|
||||
MEDIUM = 1, // Tamaño mediano
|
||||
LARGE = 2, // Tamaño grande
|
||||
EXTRALARGE = 3, // Tamaño extra grande
|
||||
};
|
||||
|
||||
enum class Type : Uint8 {
|
||||
BALLOON = 0,
|
||||
FLOATER = 1,
|
||||
POWERBALL = 2,
|
||||
BALLOON = 0, // Globo normal
|
||||
FLOATER = 1, // Globo flotante
|
||||
POWERBALL = 2, // Globo de poder
|
||||
};
|
||||
|
||||
// --- Constructores y destructor ---
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
// --- Clase BalloonFormations ---
|
||||
class BalloonFormations {
|
||||
public:
|
||||
// --- Estructuras de datos ---
|
||||
// --- Estructuras ---
|
||||
struct SpawnParams {
|
||||
int x = 0; // Posición en el eje X donde crear el globo
|
||||
int y = 0; // Posición en el eje Y donde crear el globo
|
||||
@@ -41,8 +41,8 @@ class BalloonFormations {
|
||||
Formation() = default;
|
||||
};
|
||||
|
||||
// Vector de índices a formaciones
|
||||
using Pool = std::vector<int>;
|
||||
// --- Types ---
|
||||
using Pool = std::vector<int>; // Vector de índices a formaciones
|
||||
|
||||
// --- Constructor y destructor ---
|
||||
BalloonFormations() {
|
||||
@@ -79,28 +79,20 @@ class BalloonFormations {
|
||||
static constexpr int BALLOON_SPAWN_HEIGHT = 208; // Altura desde el suelo en la que aparecen los globos
|
||||
static constexpr int DEFAULT_CREATION_TIME = 200; // Tiempo base de creación de los globos para las formaciones
|
||||
|
||||
// --- Datos ---
|
||||
// --- Variables ---
|
||||
std::vector<Formation> formations_; // Vector con todas las formaciones disponibles
|
||||
std::vector<Pool> pools_; // Vector de pools, cada pool contiene índices a formaciones
|
||||
|
||||
// --- Inicialización de formaciones ---
|
||||
// --- Métodos internos ---
|
||||
void initFormations(); // Inicializa la lista principal de formaciones de globos disponibles
|
||||
void initFormationPools(); // Carga los pools desde archivo de configuración
|
||||
|
||||
// --- Carga y análisis de datos ---
|
||||
auto loadFormationsFromFile(const std::string& filename, const std::map<std::string, float>& variables) -> bool;
|
||||
auto parseBalloonLine(const std::string& line, const std::map<std::string, float>& variables) -> std::optional<SpawnParams>;
|
||||
auto loadPoolsFromFile(const std::string& filename) -> bool; // Nueva función para cargar pools
|
||||
auto parsePoolLine(const std::string& line) -> std::optional<std::pair<int, std::vector<int>>>; // Nueva función para parsear líneas de pools
|
||||
|
||||
// --- Evaluación de expresiones ---
|
||||
auto evaluateExpression(const std::string& expr, const std::map<std::string, float>& variables) -> float;
|
||||
auto evaluateSimpleExpression(const std::string& expr, const std::map<std::string, float>& variables) -> float;
|
||||
|
||||
// --- Utilidades ---
|
||||
static auto trim(const std::string& str) -> std::string;
|
||||
|
||||
// --- Generación de variantes ---
|
||||
void createFloaterVariants();
|
||||
void loadDefaultFormations();
|
||||
void loadDefaultPools(); // Nueva función para pools por defecto
|
||||
|
||||
@@ -17,35 +17,36 @@
|
||||
|
||||
class Texture;
|
||||
|
||||
// --- Types ---
|
||||
using Balloons = std::vector<std::shared_ptr<Balloon>>;
|
||||
|
||||
// Clase BalloonManager
|
||||
// --- Clase BalloonManager: gestiona todos los globos del juego ---
|
||||
class BalloonManager {
|
||||
public:
|
||||
// Constructor y Destructor
|
||||
// --- Constructor y destructor ---
|
||||
BalloonManager(IStageInfo *stage_info);
|
||||
~BalloonManager() = default;
|
||||
|
||||
// Actualización y Renderizado
|
||||
// --- Métodos principales ---
|
||||
void update(); // Actualiza el estado de los globos
|
||||
void render(); // Renderiza los globos en pantalla
|
||||
|
||||
// Gestión de globos
|
||||
// --- Gestión de globos ---
|
||||
void freeBalloons(); // Libera globos que ya no sirven
|
||||
|
||||
// Creación de formaciones enemigas
|
||||
// --- Creación de formaciones enemigas ---
|
||||
void deployRandomFormation(int stage); // Crea una formación de globos aleatoria
|
||||
void deployFormation(int formation_id); // Crea una formación específica
|
||||
void deployFormation(int formation_id, int y); // Crea una formación específica con coordenadas
|
||||
|
||||
// Creación de globos
|
||||
// --- Creación de globos ---
|
||||
auto createBalloon(float x, int y, Balloon::Type type, Balloon::Size size, float velx, float speed, int creation_timer) -> std::shared_ptr<Balloon>; // Crea un nuevo globo
|
||||
void createChildBalloon(const std::shared_ptr<Balloon> &balloon, const std::string &direction); // Crea un globo a partir de otro
|
||||
void createPowerBall(); // Crea una PowerBall
|
||||
void createTwoBigBalloons(); // Crea dos globos grandes
|
||||
void createRandomBalloons(); // Crea una disposición aleatoria de globos
|
||||
|
||||
// Control de velocidad y despliegue
|
||||
// --- Control de velocidad y despliegue ---
|
||||
void setBalloonSpeed(float speed); // Ajusta la velocidad de los globos
|
||||
void setDefaultBalloonSpeed(float speed) { default_balloon_speed_ = speed; }; // Establece la velocidad base
|
||||
void resetBalloonSpeed() { setBalloonSpeed(default_balloon_speed_); }; // Restablece la velocidad de los globos
|
||||
@@ -53,61 +54,61 @@ class BalloonManager {
|
||||
auto canPowerBallBeCreated() -> bool; // Indica si se puede crear una PowerBall
|
||||
auto calculateScreenPower() -> int; // Calcula el poder de los globos en pantalla
|
||||
|
||||
// Manipulación de globos existentes
|
||||
// --- Manipulación de globos existentes ---
|
||||
auto popBalloon(std::shared_ptr<Balloon> balloon) -> int; // Explosiona un globo, creando otros si aplica
|
||||
auto destroyBalloon(std::shared_ptr<Balloon> &balloon) -> int; // Explosiona un globo sin crear otros
|
||||
auto destroyAllBalloons() -> int; // Destruye todos los globos
|
||||
void stopAllBalloons(); // Detiene el movimiento de los globos
|
||||
void startAllBalloons(); // Reactiva el movimiento de los globos
|
||||
|
||||
// Cambios de apariencia
|
||||
// --- Cambios de apariencia ---
|
||||
void reverseColorsToAllBalloons(); // Invierte los colores de los globos
|
||||
void normalColorsToAllBalloons(); // Restaura los colores originales
|
||||
|
||||
// Configuración de sonido
|
||||
// --- Configuración de sonido ---
|
||||
void setSounds(bool value); // Activa o desactiva los sonidos de los globos
|
||||
void setBouncingSounds(bool value); // Activa o desactiva los sonidos de rebote los globos
|
||||
void setPoppingSounds(bool value); // Activa o desactiva los sonidos de los globos al explotar
|
||||
|
||||
// Configuración de juego
|
||||
// --- Configuración de juego ---
|
||||
void setPlayArea(SDL_FRect play_area) { play_area_ = play_area; }; // Define el área de juego
|
||||
void setCreationTimeEnabled(bool value) { creation_time_enabled_ = value; }; // Activa o desactiva el tiempo de creación de globos
|
||||
void enableBalloonDeployment(bool value) { can_deploy_balloons_ = value; }; // Activa o desactiva la generación de globos
|
||||
|
||||
// Obtención de información
|
||||
// --- Getters ---
|
||||
auto getMenace() -> int; // Obtiene el nivel de amenaza generado por los globos
|
||||
[[nodiscard]] auto getBalloonSpeed() const -> float { return balloon_speed_; }
|
||||
auto getBalloons() -> Balloons & { return balloons_; }
|
||||
[[nodiscard]] auto getNumBalloons() const -> int { return balloons_.size(); }
|
||||
|
||||
private:
|
||||
// --- Constantes ---
|
||||
static const int DEFAULT_BALLOON_DEPLOY_COUNTER = 300;
|
||||
|
||||
// --- Objetos y punteros ---
|
||||
Balloons balloons_; // Vector con los globos activos
|
||||
std::unique_ptr<Explosions> explosions_; // Objeto para gestionar explosiones
|
||||
std::unique_ptr<BalloonFormations> balloon_formations_; // Objeto para manejar formaciones enemigas
|
||||
|
||||
std::vector<std::shared_ptr<Texture>> balloon_textures_; // Texturas de los globos
|
||||
std::vector<std::shared_ptr<Texture>> explosions_textures_; // Texturas de explosiones
|
||||
|
||||
std::vector<std::vector<std::string>> balloon_animations_; // Animaciones de los globos
|
||||
std::vector<std::vector<std::string>> explosions_animations_; // Animaciones de las explosiones
|
||||
IStageInfo *stage_info_; // Informacion de la pantalla actual
|
||||
|
||||
// Variables de control de globos
|
||||
// --- Variables de estado ---
|
||||
SDL_FRect play_area_ = param.game.play_area.rect;
|
||||
float balloon_speed_ = Balloon::SPEED.at(0);
|
||||
float default_balloon_speed_ = Balloon::SPEED.at(0);
|
||||
int balloon_deploy_counter_ = 0;
|
||||
bool power_ball_enabled_ = false;
|
||||
int power_ball_counter_ = 0;
|
||||
int last_balloon_deploy_ = 0;
|
||||
SDL_FRect play_area_ = param.game.play_area.rect;
|
||||
bool power_ball_enabled_ = false;
|
||||
bool creation_time_enabled_ = true;
|
||||
bool can_deploy_balloons_ = true;
|
||||
bool bouncing_sound_enabled_ = false; // Si debe sonar el globo al rebotar
|
||||
bool poping_sound_enabled_ = true; // Si debe sonar el globo al explotar
|
||||
bool sound_enabled_ = true; // Indica si los globos deben hacer algun sonido
|
||||
IStageInfo *stage_info_; // Informacion de la pantalla actual
|
||||
|
||||
// Metodos privados
|
||||
// --- Métodos internos ---
|
||||
void init();
|
||||
};
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
// Constructor
|
||||
Bullet::Bullet(float x, float y, BulletType bullet_type, bool powered, Player::Id owner)
|
||||
: sprite_(std::make_unique<AnimatedSprite>(Resource::get()->getTexture("bullet.png"), Resource::get()->getAnimation("bullet.ani"))),
|
||||
pos_x_(x),
|
||||
pos_y_(y),
|
||||
bullet_type_(bullet_type),
|
||||
owner_(owner) {
|
||||
owner_(owner) ,
|
||||
pos_x_(x),
|
||||
pos_y_(y){
|
||||
vel_x_ = calculateVelocity(bullet_type_);
|
||||
sprite_->setCurrentAnimation(buildAnimationString(bullet_type_, powered));
|
||||
|
||||
|
||||
@@ -9,65 +9,62 @@
|
||||
#include "player.h" // Para Player
|
||||
#include "utils.h" // Para Circle
|
||||
|
||||
// Tipos de balas
|
||||
// --- Enums ---
|
||||
enum class BulletType : Uint8 {
|
||||
UP,
|
||||
LEFT,
|
||||
RIGHT,
|
||||
NONE
|
||||
UP, // Bala hacia arriba
|
||||
LEFT, // Bala hacia la izquierda
|
||||
RIGHT, // Bala hacia la derecha
|
||||
NONE // Sin bala
|
||||
};
|
||||
|
||||
// Resultado del movimiento de la bala
|
||||
enum class BulletMoveStatus : Uint8 {
|
||||
OK = 0,
|
||||
OUT = 1
|
||||
OK = 0, // Movimiento normal
|
||||
OUT = 1 // Fuera de los límites
|
||||
};
|
||||
|
||||
// Clase Bullet
|
||||
// --- Clase Bullet: representa una bala del jugador ---
|
||||
class Bullet {
|
||||
public:
|
||||
// Constantes
|
||||
static constexpr float WIDTH = 12.0F;
|
||||
static constexpr float HEIGHT = 12.0F;
|
||||
// --- Constantes ---
|
||||
static constexpr float WIDTH = 12.0F; // Anchura de la bala
|
||||
static constexpr float HEIGHT = 12.0F; // Altura de la bala
|
||||
|
||||
// Constructor y Destructor
|
||||
Bullet(float x, float y, BulletType bullet_type, bool powered, Player::Id owner);
|
||||
~Bullet() = default;
|
||||
// --- Constructor y destructor ---
|
||||
Bullet(float x, float y, BulletType bullet_type, bool powered, Player::Id owner); // Constructor principal
|
||||
~Bullet() = default; // Destructor
|
||||
|
||||
// Métodos principales
|
||||
// --- Métodos principales ---
|
||||
void render(); // Dibuja la bala en pantalla
|
||||
auto update() -> BulletMoveStatus; // Actualiza el estado del objeto
|
||||
|
||||
// Estado de la bala
|
||||
[[nodiscard]] auto isEnabled() const -> bool; // Comprueba si está activa
|
||||
void disable(); // Desactiva la bala
|
||||
|
||||
// Getters
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto isEnabled() const -> bool; // Comprueba si está activa
|
||||
[[nodiscard]] auto getOwner() const -> Player::Id; // Devuelve el identificador del dueño
|
||||
auto getCollider() -> Circle &; // Devuelve el círculo de colisión
|
||||
|
||||
private:
|
||||
// Constantes
|
||||
static constexpr float VEL_Y = -3.0F;
|
||||
static constexpr float VEL_X_LEFT = -2.0F;
|
||||
static constexpr float VEL_X_RIGHT = 2.0F;
|
||||
static constexpr float VEL_X_CENTER = 0.0F;
|
||||
// --- Constantes ---
|
||||
static constexpr float VEL_Y = -3.0F; // Velocidad vertical
|
||||
static constexpr float VEL_X_LEFT = -2.0F; // Velocidad izquierda
|
||||
static constexpr float VEL_X_RIGHT = 2.0F; // Velocidad derecha
|
||||
static constexpr float VEL_X_CENTER = 0.0F; // Velocidad central
|
||||
|
||||
// Propiedades
|
||||
// --- Objetos y punteros ---
|
||||
std::unique_ptr<AnimatedSprite> sprite_; // Sprite con los gráficos
|
||||
|
||||
// --- Variables de estado ---
|
||||
Circle collider_; // Círculo de colisión
|
||||
BulletType bullet_type_; // Tipo de bala
|
||||
Player::Id owner_; // Identificador del dueño
|
||||
float pos_x_; // Posición en el eje X
|
||||
float pos_y_; // Posición en el eje Y
|
||||
float vel_x_; // Velocidad en el eje X
|
||||
|
||||
BulletType bullet_type_; // Tipo de bala
|
||||
Player::Id owner_; // Identificador del dueño
|
||||
Circle collider_; // Círculo de colisión
|
||||
|
||||
// Métodos internos
|
||||
// --- Métodos internos ---
|
||||
void shiftColliders(); // Ajusta el círculo de colisión
|
||||
void shiftSprite(); // Ajusta el sprite
|
||||
auto move() -> BulletMoveStatus; // Mueve la bala y devuelve su estado
|
||||
static auto calculateVelocity(BulletType bullet_type) -> float; // Calcula la velocidad horizontal de la bala basada en su tipo
|
||||
static auto buildAnimationString(BulletType bullet_type, bool powered) -> std::string; // Construye el string de animación basado en el tipo de bala y si está potenciada
|
||||
static auto calculateVelocity(BulletType bullet_type) -> float; // Calcula la velocidad horizontal de la bala
|
||||
static auto buildAnimationString(BulletType bullet_type, bool powered) -> std::string; // Construye el string de animación
|
||||
};
|
||||
|
||||
@@ -12,9 +12,7 @@
|
||||
// --- Constantes ---
|
||||
constexpr size_t COLOR_CYCLE_SIZE = 6; // Mitad del ciclo espejado
|
||||
|
||||
// --- Estructuras y tipos ---
|
||||
|
||||
// Estructura para definir un color RGBA
|
||||
// --- Estructura Color: define un color RGBA ---
|
||||
struct Color {
|
||||
private:
|
||||
static constexpr int DEFAULT_LIGHTEN_AMOUNT = 50;
|
||||
@@ -91,12 +89,14 @@ struct Color {
|
||||
}
|
||||
};
|
||||
|
||||
// Estructura para definir un color HSV
|
||||
// --- Estructura HSV: define un color en formato HSV ---
|
||||
struct HSV {
|
||||
float h, s, v;
|
||||
float h; // Matiz (Hue)
|
||||
float s; // Saturación (Saturation)
|
||||
float v; // Valor (Value)
|
||||
};
|
||||
|
||||
// Estructura para definir el ciclo de color
|
||||
// --- Enum ColorCycleStyle: define estilos de ciclo de color ---
|
||||
enum class ColorCycleStyle {
|
||||
SUBTLE_PULSE, // Variación leve en brillo (por defecto)
|
||||
HUE_WAVE, // Variación suave en tono (sin verde)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "color.h"
|
||||
#include "ui/notifier.h" // Para Notifier::Position
|
||||
|
||||
// Configuración centralizada con todos los valores por defecto del juego
|
||||
// --- Namespace GameDefaults: configuración centralizada con valores por defecto del juego ---
|
||||
namespace GameDefaults {
|
||||
|
||||
// --- GAME ---
|
||||
|
||||
@@ -15,8 +15,10 @@ namespace Options {
|
||||
struct Gamepad;
|
||||
}
|
||||
|
||||
// --- Clase DefineButtons: configuración de botones de gamepad ---
|
||||
class DefineButtons {
|
||||
public:
|
||||
// --- Estructuras ---
|
||||
struct Button {
|
||||
std::string label;
|
||||
Input::Action action;
|
||||
@@ -26,36 +28,36 @@ class DefineButtons {
|
||||
: label(std::move(label)), action(action), button(button) {}
|
||||
};
|
||||
|
||||
// --- Constructor y destructor ---
|
||||
DefineButtons();
|
||||
~DefineButtons() = default;
|
||||
|
||||
// --- Métodos principales ---
|
||||
void render();
|
||||
void update();
|
||||
void handleEvents(const SDL_Event &event);
|
||||
auto enable(Options::Gamepad *options_gamepad) -> bool;
|
||||
void disable();
|
||||
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto isReadyToClose() const -> bool;
|
||||
[[nodiscard]] auto isEnabled() const -> bool { return enabled_; }
|
||||
[[nodiscard]] auto isFinished() const -> bool { return finished_; }
|
||||
|
||||
private:
|
||||
// Constante para cuánto tiempo mostrar el mensaje (en frames)
|
||||
static constexpr size_t MESSAGE_DISPLAY_FRAMES = 120; // ~2 segundos a 60fps
|
||||
// --- Constantes ---
|
||||
static constexpr size_t MESSAGE_DISPLAY_FRAMES = 120; // Cuánto tiempo mostrar el mensaje (en frames) ~2 segundos a 60fps
|
||||
|
||||
// Punteros
|
||||
// --- Objetos y punteros ---
|
||||
Input *input_ = nullptr; // Entrada del usuario
|
||||
Options::Gamepad *options_gamepad_ = nullptr; // Opciones del gamepad
|
||||
std::unique_ptr<WindowMessage> window_message_; // Mensaje de ventana
|
||||
|
||||
// Vectores y strings
|
||||
// --- Variables de estado ---
|
||||
std::vector<Button> buttons_; // Lista de botones
|
||||
std::vector<std::string> controller_names_; // Nombres de los controladores
|
||||
|
||||
// size_t
|
||||
size_t index_button_ = 0; // Índice del botón seleccionado
|
||||
size_t message_timer_ = 0; // Contador de frames para el mensaje
|
||||
|
||||
// bools
|
||||
bool enabled_ = false; // Flag para indicar si está activo
|
||||
bool finished_ = false; // Flag para indicar si ha terminado
|
||||
bool closing_ = false; // Flag para indicar que está cerrando
|
||||
@@ -63,7 +65,7 @@ class DefineButtons {
|
||||
bool l2_was_pressed_ = false; // Estado anterior del trigger L2
|
||||
bool r2_was_pressed_ = false; // Estado anterior del trigger R2
|
||||
|
||||
// Métodos
|
||||
// --- Métodos internos ---
|
||||
void incIndexButton();
|
||||
void doControllerButtonDown(const SDL_GamepadButtonEvent &event);
|
||||
void doControllerAxisMotion(const SDL_GamepadAxisEvent &event);
|
||||
|
||||
@@ -1,52 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <string> // Para string
|
||||
#include <vector> // Para vector
|
||||
|
||||
namespace Difficulty {
|
||||
|
||||
/**
|
||||
* @brief Códigos que identifican unívocamente cada nivel de dificultad.
|
||||
*/
|
||||
// --- Enums ---
|
||||
enum class Code {
|
||||
EASY = 0,
|
||||
NORMAL = 1,
|
||||
HARD = 2,
|
||||
EASY = 0, // Dificultad fácil
|
||||
NORMAL = 1, // Dificultad normal
|
||||
HARD = 2, // Dificultad difícil
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Estructura que asocia un código de dificultad con su nombre traducible.
|
||||
*/
|
||||
// --- Estructuras ---
|
||||
struct Info {
|
||||
Code code;
|
||||
std::string name;
|
||||
Code code; // Código de dificultad
|
||||
std::string name; // Nombre traducible
|
||||
};
|
||||
|
||||
// --- Interfaz Pública ---
|
||||
// --- Funciones ---
|
||||
void init(); // Inicializa la lista de dificultades con sus valores por defecto
|
||||
|
||||
/**
|
||||
* @brief Inicializa la lista de dificultades con sus valores por defecto.
|
||||
*/
|
||||
void init();
|
||||
|
||||
/**
|
||||
* @brief Devuelve una referencia al vector de todas las dificultades para su lectura o modificación.
|
||||
* @return Referencia a `std::vector<Info>&`.
|
||||
*/
|
||||
auto getDifficulties() -> std::vector<Info>&;
|
||||
|
||||
/**
|
||||
* @brief Obtiene el nombre de una dificultad a partir de su código.
|
||||
* @param code El código de la dificultad.
|
||||
* @return El nombre de la dificultad.
|
||||
*/
|
||||
auto getNameFromCode(Code code) -> std::string;
|
||||
|
||||
/**
|
||||
* @brief Obtiene el código de una dificultad a partir de su nombre.
|
||||
* @param name El nombre de la dificultad.
|
||||
* @return El código de la dificultad.
|
||||
*/
|
||||
auto getCodeFromName(const std::string& name) -> Code;
|
||||
auto getDifficulties() -> std::vector<Info>&; // Devuelve una referencia al vector de todas las dificultades
|
||||
auto getNameFromCode(Code code) -> std::string; // Obtiene el nombre de una dificultad a partir de su código
|
||||
auto getCodeFromName(const std::string& name) -> Code; // Obtiene el código de una dificultad a partir de su nombre
|
||||
|
||||
} // namespace Difficulty
|
||||
@@ -41,7 +41,7 @@ Director::Director(int argc, std::span<char *> argv) {
|
||||
Section::name = Section::Name::GAME;
|
||||
Section::options = Section::Options::GAME_PLAY_1P;
|
||||
#elif _DEBUG
|
||||
Section::name = Section::Name::GAME;
|
||||
Section::name = Section::Name::LOGO;
|
||||
Section::options = Section::Options::GAME_PLAY_1P;
|
||||
#else // NORMAL GAME
|
||||
Section::name = Section::Name::LOGO;
|
||||
|
||||
@@ -7,6 +7,7 @@ namespace Lang {
|
||||
enum class Code : int;
|
||||
}
|
||||
|
||||
// --- Clase Director: gestor principal de la aplicación ---
|
||||
class Director {
|
||||
public:
|
||||
// --- Constructor y destructor ---
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
|
||||
#include "utils.h" // Para trim
|
||||
|
||||
// Tamaño máximo del nombre
|
||||
constexpr size_t NAME_SIZE = 5;
|
||||
// --- Constantes ---
|
||||
constexpr size_t NAME_SIZE = 5; // Tamaño máximo del nombre
|
||||
|
||||
// Clase EnterName
|
||||
// --- Clase EnterName: gestor de entrada de nombre del jugador ---
|
||||
class EnterName {
|
||||
public:
|
||||
EnterName();
|
||||
@@ -29,11 +29,12 @@ class EnterName {
|
||||
[[nodiscard]] auto getPositionOverflow() const -> bool { return position_overflow_; } // Indica si la posición excede el límite
|
||||
|
||||
private:
|
||||
// --- Variables de estado ---
|
||||
std::string character_list_; // Lista de caracteres permitidos
|
||||
std::string name_; // Nombre en proceso
|
||||
std::array<int, NAME_SIZE> character_index_; // Índices a "character_list_"
|
||||
size_t position_ = 0; // Índice del carácter que se edita
|
||||
bool position_overflow_ = false; // Flag para exceder límite
|
||||
std::array<int, NAME_SIZE> character_index_; // Índices a "character_list_"
|
||||
|
||||
void updateNameFromCharacterIndex(); // Actualiza "name_" según "character_index_"
|
||||
void initCharacterIndex(const std::string &name); // Inicializa índices desde el nombre
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
|
||||
#include <memory> // Para unique_ptr, shared_ptr
|
||||
#include <string> // Para string
|
||||
#include <utility>
|
||||
#include <utility> // Para move
|
||||
#include <vector> // Para vector
|
||||
|
||||
#include "animated_sprite.h" // Para AnimatedSprite
|
||||
|
||||
class Texture;
|
||||
|
||||
// Estructura para almacenar la información de una textura de explosión
|
||||
// --- Estructura ExplosionTexture: almacena información de una textura de explosión ---
|
||||
struct ExplosionTexture {
|
||||
int size; // Tamaño de la explosión
|
||||
std::shared_ptr<Texture> texture; // Textura para la explosión
|
||||
@@ -19,35 +19,27 @@ struct ExplosionTexture {
|
||||
: size(sz), texture(std::move(tex)), animation(anim) {}
|
||||
};
|
||||
|
||||
// Clase Explosions
|
||||
// --- Clase Explosions: gestor de explosiones ---
|
||||
class Explosions {
|
||||
public:
|
||||
// Constructor y destructor
|
||||
Explosions() = default;
|
||||
~Explosions() = default;
|
||||
// --- Constructor y destructor ---
|
||||
Explosions() = default; // Constructor por defecto
|
||||
~Explosions() = default; // Destructor por defecto
|
||||
|
||||
// Actualiza la lógica de la clase
|
||||
void update();
|
||||
// --- Métodos principales ---
|
||||
void update(); // Actualiza la lógica de la clase
|
||||
void render(); // Dibuja el objeto en pantalla
|
||||
|
||||
// Dibuja el objeto en pantalla
|
||||
void render();
|
||||
|
||||
// Añade texturas al objeto
|
||||
void addTexture(int size, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation);
|
||||
|
||||
// Añade una explosión
|
||||
void add(int x, int y, int size);
|
||||
// --- Configuración ---
|
||||
void addTexture(int size, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation); // Añade texturas al objeto
|
||||
void add(int x, int y, int size); // Añade una explosión
|
||||
|
||||
private:
|
||||
// Vector con las texturas a utilizar
|
||||
std::vector<ExplosionTexture> textures_;
|
||||
// --- Variables de estado ---
|
||||
std::vector<ExplosionTexture> textures_; // Vector con las texturas a utilizar
|
||||
std::vector<std::unique_ptr<AnimatedSprite>> explosions_; // Lista con todas las explosiones
|
||||
|
||||
// Lista con todas las explosiones
|
||||
std::vector<std::unique_ptr<AnimatedSprite>> explosions_;
|
||||
|
||||
// Vacia el vector de elementos finalizados
|
||||
void freeExplosions();
|
||||
|
||||
// Busca una textura a partir del tamaño
|
||||
auto getIndexBySize(int size) -> int;
|
||||
// --- Métodos internos ---
|
||||
void freeExplosions(); // Vacía el vector de elementos finalizados
|
||||
auto getIndexBySize(int size) -> int; // Busca una textura a partir del tamaño
|
||||
};
|
||||
@@ -6,29 +6,28 @@
|
||||
|
||||
struct Color;
|
||||
|
||||
// Tipos de fundido
|
||||
// --- Enums ---
|
||||
enum class FadeType : Uint8 {
|
||||
FULLSCREEN = 0,
|
||||
CENTER = 1,
|
||||
RANDOM_SQUARE = 2,
|
||||
VENETIAN = 3,
|
||||
FULLSCREEN = 0, // Fundido de pantalla completa
|
||||
CENTER = 1, // Fundido desde el centro
|
||||
RANDOM_SQUARE = 2, // Fundido con cuadrados aleatorios
|
||||
VENETIAN = 3, // Fundido tipo persiana veneciana
|
||||
};
|
||||
|
||||
// Modos de fundido
|
||||
enum class FadeMode : Uint8 {
|
||||
IN = 0,
|
||||
OUT = 1,
|
||||
IN = 0, // Fundido de entrada
|
||||
OUT = 1, // Fundido de salida
|
||||
};
|
||||
|
||||
// Estados del objeto
|
||||
enum class FadeState : Uint8 {
|
||||
NOT_ENABLED = 0,
|
||||
PRE = 1,
|
||||
FADING = 2,
|
||||
POST = 3,
|
||||
FINISHED = 4,
|
||||
NOT_ENABLED = 0, // No activado
|
||||
PRE = 1, // Estado previo
|
||||
FADING = 2, // Fundiendo
|
||||
POST = 3, // Estado posterior
|
||||
FINISHED = 4, // Finalizado
|
||||
};
|
||||
|
||||
// --- Clase Fade: gestor de transiciones de fundido ---
|
||||
class Fade {
|
||||
public:
|
||||
// --- Constructores y destructor ---
|
||||
@@ -42,12 +41,12 @@ class Fade {
|
||||
void activate(); // Activa el fade
|
||||
|
||||
// --- Configuración ---
|
||||
void setColor(Uint8 r, Uint8 g, Uint8 b);
|
||||
void setColor(Color color);
|
||||
void setType(FadeType type) { type_ = type; }
|
||||
void setMode(FadeMode mode) { mode_ = mode; }
|
||||
void setPostDuration(int value) { post_duration_ = value; }
|
||||
void setPreDuration(int value) { pre_duration_ = value; }
|
||||
void setColor(Uint8 r, Uint8 g, Uint8 b); // Establece el color RGB del fade
|
||||
void setColor(Color color); // Establece el color del fade
|
||||
void setType(FadeType type) { type_ = type; } // Establece el tipo de fade
|
||||
void setMode(FadeMode mode) { mode_ = mode; } // Establece el modo de fade
|
||||
void setPostDuration(int value) { post_duration_ = value; } // Duración posterior al fade
|
||||
void setPreDuration(int value) { pre_duration_ = value; } // Duración previa al fade
|
||||
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto getValue() const -> int { return value_; }
|
||||
@@ -60,27 +59,21 @@ class Fade {
|
||||
SDL_Texture *backbuffer_; // Backbuffer para efectos
|
||||
|
||||
// --- Variables de estado ---
|
||||
std::vector<SDL_FRect> square_; // Vector de cuadrados
|
||||
SDL_FRect rect1_, rect2_; // Rectángulos para efectos
|
||||
FadeType type_; // Tipo de fade
|
||||
FadeMode mode_; // Modo de fade
|
||||
FadeState state_ = FadeState::NOT_ENABLED; // Estado actual
|
||||
Uint16 counter_; // Contador interno
|
||||
|
||||
// --- Parámetros de color y geometría ---
|
||||
Uint8 r_, g_, b_, a_; // Color del fade
|
||||
SDL_FRect rect1_, rect2_; // Rectángulos para efectos
|
||||
|
||||
// --- Parámetros para RANDOM_SQUARE ---
|
||||
Uint8 r_, g_, b_, a_; // Color del fade (RGBA)
|
||||
int num_squares_width_; // Cuadrados en horizontal
|
||||
int num_squares_height_; // Cuadrados en vertical
|
||||
std::vector<SDL_FRect> square_; // Vector de cuadrados
|
||||
int fade_random_squares_delay_; // Delay entre cuadrados
|
||||
int fade_random_squares_mult_; // Cuadrados por paso
|
||||
|
||||
// --- Temporizadores ---
|
||||
int post_duration_ = 0, post_counter_ = 0;
|
||||
int pre_duration_ = 0, pre_counter_ = 0;
|
||||
|
||||
// --- Valor de progreso ---
|
||||
int post_duration_ = 0; // Duración posterior
|
||||
int post_counter_ = 0; // Contador posterior
|
||||
int pre_duration_ = 0; // Duración previa
|
||||
int pre_counter_ = 0; // Contador previo
|
||||
int value_ = 0; // Estado del fade (0-100)
|
||||
|
||||
// --- Inicialización y limpieza ---
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
class Texture;
|
||||
|
||||
// Clase GameLogo
|
||||
// --- Clase GameLogo: gestor del logo del juego ---
|
||||
class GameLogo {
|
||||
public:
|
||||
// --- Constructores y destructor ---
|
||||
@@ -24,14 +24,15 @@ class GameLogo {
|
||||
[[nodiscard]] auto hasFinished() const -> bool; // Indica si ha terminado la animación
|
||||
|
||||
private:
|
||||
// --- Tipos internos ---
|
||||
// --- Enums ---
|
||||
enum class Status {
|
||||
DISABLED,
|
||||
MOVING,
|
||||
SHAKING,
|
||||
FINISHED,
|
||||
DISABLED, // Deshabilitado
|
||||
MOVING, // En movimiento
|
||||
SHAKING, // Temblando
|
||||
FINISHED, // Terminado
|
||||
};
|
||||
|
||||
// --- Estructuras privadas ---
|
||||
struct Shake {
|
||||
int desp = 1; // Pixels de desplazamiento para agitar la pantalla en el eje x
|
||||
int delay = 2; // Retraso entre cada desplazamiento de la pantalla al agitarse
|
||||
@@ -67,15 +68,14 @@ class GameLogo {
|
||||
std::unique_ptr<Sprite> arcade_edition_sprite_; // Sprite de "Arcade Edition"
|
||||
|
||||
// --- Variables de estado ---
|
||||
Shake shake_; // Efecto de agitación
|
||||
Status coffee_crisis_status_ = Status::DISABLED; // Estado de "COFFEE CRISIS"
|
||||
Status arcade_edition_status_ = Status::DISABLED; // Estado de "ARCADE EDITION"
|
||||
float x_; // Posición X del logo
|
||||
float y_; // Posición Y del logo
|
||||
float zoom_ = 1.0F; // Zoom aplicado al texto "ARCADE EDITION"
|
||||
int post_finished_counter_ = 1; // Contador final tras animaciones
|
||||
|
||||
Status coffee_crisis_status_ = Status::DISABLED; // Estado de "COFFEE CRISIS"
|
||||
Status arcade_edition_status_ = Status::DISABLED; // Estado de "ARCADE EDITION"
|
||||
Shake shake_; // Efecto de agitación
|
||||
|
||||
// --- Inicialización ---
|
||||
void init(); // Inicializa las variables
|
||||
[[nodiscard]] auto getInitialVerticalDesp() const -> int; // Calcula el desplazamiento vertical inicial
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "external/json.hpp"
|
||||
#include "input_types.h" // Solo incluimos los tipos compartidos
|
||||
|
||||
// --- Estructuras ---
|
||||
struct GamepadConfig {
|
||||
std::string name; // Nombre del dispositivo
|
||||
std::string path; // Ruta física del dispositivo
|
||||
@@ -29,12 +30,14 @@ struct GamepadConfig {
|
||||
}
|
||||
};
|
||||
|
||||
using GamepadConfigs = std::vector<GamepadConfig>;
|
||||
// --- Tipos ---
|
||||
using GamepadConfigs = std::vector<GamepadConfig>; // Vector de configuraciones de gamepad
|
||||
|
||||
// --- Clase GamepadConfigManager: gestor de configuraciones de gamepad ---
|
||||
class GamepadConfigManager {
|
||||
public:
|
||||
// Escribir vector de GamepadConfig a archivo JSON
|
||||
static auto writeToJson(const GamepadConfigs& configs, const std::string& filename) -> bool {
|
||||
// --- Métodos estáticos ---
|
||||
static auto writeToJson(const GamepadConfigs& configs, const std::string& filename) -> bool { // Escribir configuraciones a JSON
|
||||
try {
|
||||
nlohmann::json j;
|
||||
j["gamepads"] = nlohmann::json::array();
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
#include <SDL3/SDL.h>
|
||||
|
||||
// --- Namespace GlobalEvents: maneja eventos globales del juego ---
|
||||
namespace GlobalEvents {
|
||||
// Comprueba los eventos que se pueden producir en cualquier sección del juego
|
||||
void handle(const SDL_Event &event);
|
||||
// --- Funciones ---
|
||||
void handle(const SDL_Event &event); // Comprueba los eventos que se pueden producir en cualquier sección del juego
|
||||
} // namespace GlobalEvents
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
// --- Namespace GlobalInputs: gestiona inputs globales del juego ---
|
||||
namespace GlobalInputs {
|
||||
// Comprueba los inputs que se pueden introducir en cualquier sección del juego
|
||||
auto check() -> bool;
|
||||
// --- Funciones ---
|
||||
auto check() -> bool; // Comprueba los inputs que se pueden introducir en cualquier sección del juego
|
||||
} // namespace GlobalInputs
|
||||
65
source/hit.h
65
source/hit.h
@@ -7,55 +7,44 @@
|
||||
#include "sprite.h" // Para Sprite
|
||||
#include "texture.h" // Para Texture
|
||||
|
||||
// Estructura que representa una colisión o impacto visual
|
||||
// --- Estructura Hit: representa una colisión o impacto visual ---
|
||||
struct Hit {
|
||||
private:
|
||||
// Indica si el Hit está activo o no
|
||||
bool enabled_{false};
|
||||
|
||||
// Sprite asociado al Hit, gestionado con un puntero único
|
||||
std::unique_ptr<Sprite> sprite_;
|
||||
|
||||
public:
|
||||
// Elimina el constructor por defecto para obligar a pasar una textura
|
||||
Hit() = delete;
|
||||
|
||||
// Constructor que obliga a pasar una textura compartida para crear el Sprite
|
||||
// Esto evita que se pueda crear un Hit sin recursos gráficos válidos
|
||||
explicit Hit(std::shared_ptr<Texture> texture)
|
||||
// --- Constructor ---
|
||||
Hit() = delete; // Elimina el constructor por defecto para obligar a pasar una textura
|
||||
explicit Hit(std::shared_ptr<Texture> texture) // Constructor con textura obligatoria
|
||||
: sprite_(std::make_unique<Sprite>(texture)) {}
|
||||
|
||||
// Establece la posición del Sprite en el espacio
|
||||
void setPos(SDL_FPoint position) {
|
||||
SDL_FPoint centered_position = {position.x - (sprite_->getWidth() / 2), position.y - (sprite_->getHeight() / 2)};
|
||||
sprite_->setPosition(centered_position);
|
||||
}
|
||||
|
||||
// Activa o desactiva el Hit
|
||||
void enable(bool value) {
|
||||
enabled_ = value;
|
||||
}
|
||||
|
||||
// Consulta si el Hit está activo
|
||||
[[nodiscard]] auto isEnabled() const -> bool {
|
||||
return enabled_;
|
||||
}
|
||||
|
||||
// Crea un "Hit" en la posición especificada
|
||||
void create(SDL_FPoint position) {
|
||||
// --- Métodos principales ---
|
||||
void create(SDL_FPoint position) { // Crea un "Hit" en la posición especificada
|
||||
setPos(position);
|
||||
enable(true);
|
||||
}
|
||||
|
||||
// Dibuja el hit
|
||||
void render() {
|
||||
void render() { // Dibuja el hit
|
||||
if (enabled_) {
|
||||
sprite_->render();
|
||||
}
|
||||
}
|
||||
|
||||
// Deshabilita el hit
|
||||
void disable() {
|
||||
void disable() { // Deshabilita el hit
|
||||
enabled_ = false;
|
||||
}
|
||||
|
||||
// --- Configuración ---
|
||||
void setPos(SDL_FPoint position) { // Establece la posición del Sprite en el espacio
|
||||
SDL_FPoint centered_position = {position.x - (sprite_->getWidth() / 2), position.y - (sprite_->getHeight() / 2)};
|
||||
sprite_->setPosition(centered_position);
|
||||
}
|
||||
void enable(bool value) { // Activa o desactiva el Hit
|
||||
enabled_ = value;
|
||||
}
|
||||
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto isEnabled() const -> bool { // Consulta si el Hit está activo
|
||||
return enabled_;
|
||||
}
|
||||
|
||||
private:
|
||||
// --- Variables de estado ---
|
||||
std::unique_ptr<Sprite> sprite_; // Sprite asociado al Hit
|
||||
bool enabled_{false}; // Indica si el Hit está activo
|
||||
};
|
||||
|
||||
@@ -11,22 +11,19 @@
|
||||
#include "gamepad_config_manager.h" // Para GamepadConfig (ptr only), GamepadConfigs
|
||||
#include "input_types.h" // Para InputAction
|
||||
|
||||
// Clase Input: gestiona la entrada de teclado y mandos (singleton)
|
||||
// --- Clase Input: gestiona la entrada de teclado y mandos (singleton) ---
|
||||
class Input {
|
||||
public:
|
||||
// --- Constantes ---
|
||||
static constexpr bool ALLOW_REPEAT = true;
|
||||
static constexpr bool DO_NOT_ALLOW_REPEAT = false;
|
||||
static constexpr bool ALLOW_REPEAT = true; // Permite repetición
|
||||
static constexpr bool DO_NOT_ALLOW_REPEAT = false; // No permite repetición
|
||||
static constexpr bool CHECK_KEYBOARD = true; // Comprueba teclado
|
||||
static constexpr bool DO_NOT_CHECK_KEYBOARD = false; // No comprueba teclado
|
||||
static constexpr SDL_GamepadButton TRIGGER_L2_AS_BUTTON = static_cast<SDL_GamepadButton>(100); // L2 como botón
|
||||
static constexpr SDL_GamepadButton TRIGGER_R2_AS_BUTTON = static_cast<SDL_GamepadButton>(101); // R2 como botón
|
||||
|
||||
static constexpr bool CHECK_KEYBOARD = true;
|
||||
static constexpr bool DO_NOT_CHECK_KEYBOARD = false;
|
||||
|
||||
// Constantes para triggers como botones
|
||||
static constexpr SDL_GamepadButton TRIGGER_L2_AS_BUTTON = static_cast<SDL_GamepadButton>(100);
|
||||
static constexpr SDL_GamepadButton TRIGGER_R2_AS_BUTTON = static_cast<SDL_GamepadButton>(101);
|
||||
|
||||
// Alias para mantener compatibilidad con el código existente
|
||||
using Action = InputAction;
|
||||
// --- Tipos ---
|
||||
using Action = InputAction; // Alias para mantener compatibilidad
|
||||
|
||||
// --- Estructuras ---
|
||||
struct KeyState {
|
||||
@@ -137,7 +134,8 @@ class Input {
|
||||
}
|
||||
};
|
||||
|
||||
using Gamepads = std::vector<std::shared_ptr<Gamepad>>;
|
||||
// --- Tipos ---
|
||||
using Gamepads = std::vector<std::shared_ptr<Gamepad>>; // Vector de gamepads
|
||||
|
||||
// --- Métodos de singleton ---
|
||||
static void init(const std::string &game_controller_db_path, const std::string &gamepad_configs_file);
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
// Acciones de entrada posibles en el juego
|
||||
enum class InputAction : int {
|
||||
// --- Enums ---
|
||||
enum class InputAction : int { // Acciones de entrada posibles en el juego
|
||||
// Inputs de movimiento
|
||||
UP,
|
||||
DOWN,
|
||||
@@ -47,9 +47,9 @@ enum class InputAction : int {
|
||||
SIZE,
|
||||
};
|
||||
|
||||
// Mapas para convertir entre enums y strings
|
||||
extern const std::unordered_map<InputAction, std::string> ACTION_TO_STRING;
|
||||
extern const std::unordered_map<std::string, InputAction> STRING_TO_ACTION;
|
||||
extern const std::unordered_map<SDL_GamepadButton, std::string> BUTTON_TO_STRING;
|
||||
extern const std::unordered_map<std::string, SDL_GamepadButton> STRING_TO_BUTTON;
|
||||
extern const std::unordered_map<InputAction, InputAction> ACTION_TO_ACTION;
|
||||
// --- Variables ---
|
||||
extern const std::unordered_map<InputAction, std::string> ACTION_TO_STRING; // Mapeo de acción a string
|
||||
extern const std::unordered_map<std::string, InputAction> STRING_TO_ACTION; // Mapeo de string a acción
|
||||
extern const std::unordered_map<SDL_GamepadButton, std::string> BUTTON_TO_STRING; // Mapeo de botón a string
|
||||
extern const std::unordered_map<std::string, SDL_GamepadButton> STRING_TO_BUTTON; // Mapeo de string a botón
|
||||
extern const std::unordered_map<InputAction, InputAction> ACTION_TO_ACTION; // Mapeo de acción a acción
|
||||
@@ -10,8 +10,8 @@ class Texture; // lines 6-6
|
||||
|
||||
Item::Item(ItemType type, float x, float y, SDL_FRect &play_area, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation)
|
||||
: sprite_(std::make_unique<AnimatedSprite>(texture, animation)),
|
||||
type_(type),
|
||||
play_area_(play_area) {
|
||||
play_area_(play_area),
|
||||
type_(type) {
|
||||
switch (type) {
|
||||
case ItemType::COFFEE_MACHINE: {
|
||||
width_ = COFFEE_MACHINE_WIDTH;
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
|
||||
class Texture;
|
||||
|
||||
// Tipos de objetos disponibles en el juego.
|
||||
// Define los diferentes tipos de objetos que pueden existir en el juego.
|
||||
// --- Enums ---
|
||||
enum class ItemType : int {
|
||||
DISK = 1, // Disco
|
||||
GAVINA = 2, // Gavina
|
||||
@@ -24,81 +23,57 @@ enum class ItemType : int {
|
||||
NONE = 8, // Ninguno
|
||||
};
|
||||
|
||||
// Clase Item.
|
||||
// Representa un objeto en el juego, con sus propiedades y métodos para gestionar su comportamiento.
|
||||
// --- Clase Item: representa un objeto en el juego ---
|
||||
class Item {
|
||||
public:
|
||||
// Constantes
|
||||
static constexpr int COFFEE_MACHINE_WIDTH = 30;
|
||||
static constexpr int COFFEE_MACHINE_HEIGHT = 39;
|
||||
// --- Constantes ---
|
||||
static constexpr int COFFEE_MACHINE_WIDTH = 30; // Anchura de la máquina de café
|
||||
static constexpr int COFFEE_MACHINE_HEIGHT = 39; // Altura de la máquina de café
|
||||
|
||||
// Constructor. Inicializa un objeto Item con el tipo, posición, área de juego, textura y animación.
|
||||
Item(ItemType type, float x, float y, SDL_FRect &play_area, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation);
|
||||
// --- Constructor y destructor ---
|
||||
Item(ItemType type, float x, float y, SDL_FRect &play_area, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation); // Constructor principal
|
||||
~Item() = default; // Destructor
|
||||
|
||||
// Destructor.
|
||||
~Item() = default;
|
||||
// --- Métodos principales ---
|
||||
void alignTo(int x); // Centra el objeto en la posición X indicada
|
||||
void render(); // Renderiza el objeto en pantalla
|
||||
void disable(); // Desactiva el objeto
|
||||
void update(); // Actualiza la posición, animación y contadores
|
||||
|
||||
// Centra el objeto en la posición X indicada, asegurando que no se salga del área de juego.
|
||||
void alignTo(int x);
|
||||
|
||||
// Renderiza el objeto en pantalla si está habilitado.
|
||||
// Si el tiempo de vida es mayor que 200, renderiza el sprite.
|
||||
// Si es menor o igual a 200, renderiza el sprite de forma intermitente.
|
||||
void render();
|
||||
|
||||
// Desactiva el objeto estableciendo su estado enabled_ a false.
|
||||
void disable();
|
||||
|
||||
// Actualiza la posición, animación y contadores del objeto.
|
||||
// Llama a move(), sprite_->update() y updateTimeToLive().
|
||||
void update();
|
||||
|
||||
// Getters
|
||||
[[nodiscard]] auto getPosX() const -> float { return pos_x_; }
|
||||
[[nodiscard]] auto getPosY() const -> float { return pos_y_; }
|
||||
[[nodiscard]] auto getWidth() const -> int { return width_; }
|
||||
[[nodiscard]] auto getHeight() const -> int { return height_; }
|
||||
[[nodiscard]] auto getType() const -> ItemType { return type_; }
|
||||
[[nodiscard]] auto isEnabled() const -> bool { return enabled_; }
|
||||
[[nodiscard]] auto isOnFloor() const -> bool { return floor_collision_; }
|
||||
auto getCollider() -> Circle & { return collider_; }
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto getPosX() const -> float { return pos_x_; } // Obtiene la posición X
|
||||
[[nodiscard]] auto getPosY() const -> float { return pos_y_; } // Obtiene la posición Y
|
||||
[[nodiscard]] auto getWidth() const -> int { return width_; } // Obtiene la anchura
|
||||
[[nodiscard]] auto getHeight() const -> int { return height_; } // Obtiene la altura
|
||||
[[nodiscard]] auto getType() const -> ItemType { return type_; } // Obtiene el tipo
|
||||
[[nodiscard]] auto isEnabled() const -> bool { return enabled_; } // Verifica si está habilitado
|
||||
[[nodiscard]] auto isOnFloor() const -> bool { return floor_collision_; } // Verifica si está en el suelo
|
||||
auto getCollider() -> Circle & { return collider_; } // Obtiene el colisionador
|
||||
|
||||
private:
|
||||
// Objetos y punteros
|
||||
// --- Objetos y punteros ---
|
||||
std::unique_ptr<AnimatedSprite> sprite_; // Sprite con los gráficos del objeto
|
||||
|
||||
// Variables de estado y físicas
|
||||
// --- Variables de estado ---
|
||||
SDL_FRect play_area_; // Rectángulo con la zona de juego
|
||||
Circle collider_; // Círculo de colisión del objeto
|
||||
ItemType type_; // Tipo de objeto
|
||||
float pos_x_; // Posición X del objeto
|
||||
float pos_y_; // Posición Y del objeto
|
||||
int width_; // Ancho del objeto
|
||||
int height_; // Alto del objeto
|
||||
float vel_x_; // Velocidad en el eje X
|
||||
float vel_y_; // Velocidad en el eje Y
|
||||
float accel_x_ = 0.0F; // Aceleración en el eje X
|
||||
float accel_y_; // Aceleración en el eje Y
|
||||
bool floor_collision_ = false; // Indica si el objeto colisiona con el suelo
|
||||
ItemType type_; // Tipo de objeto
|
||||
bool enabled_ = true; // Indica si el objeto está habilitado
|
||||
Circle collider_; // Círculo de colisión del objeto
|
||||
SDL_FRect play_area_; // Rectángulo con la zona de juego
|
||||
int width_; // Ancho del objeto
|
||||
int height_; // Alto del objeto
|
||||
Uint16 time_to_live_ = 600; // Tiempo que el objeto está presente
|
||||
bool floor_collision_ = false; // Indica si el objeto colisiona con el suelo
|
||||
bool enabled_ = true; // Indica si el objeto está habilitado
|
||||
|
||||
// Alinea el círculo de colisión con la posición del objeto.
|
||||
// Actualiza las coordenadas X e Y del colisionador.
|
||||
void shiftColliders();
|
||||
|
||||
// Coloca el sprite en la posición del objeto.
|
||||
// Actualiza las coordenadas X e Y del sprite.
|
||||
void shiftSprite();
|
||||
|
||||
// Actualiza la posición y estados del objeto.
|
||||
// Controla las colisiones con los límites del área de juego y actualiza sprite y colisionador.
|
||||
void move();
|
||||
|
||||
// Actualiza el contador de tiempo de vida del objeto.
|
||||
// Si el tiempo de vida es mayor a 0, lo decrementa. Si llega a 0, desactiva el objeto.
|
||||
void updateTimeToLive();
|
||||
|
||||
// Calcula la zona de aparición de la máquina de café
|
||||
static auto getCoffeeMachineSpawn(int player_x, int item_width, int area_width, int margin = 2) -> int;
|
||||
// --- Métodos internos ---
|
||||
void shiftColliders(); // Alinea el círculo de colisión con la posición del objeto
|
||||
void shiftSprite(); // Coloca el sprite en la posición del objeto
|
||||
void move(); // Actualiza la posición y estados del objeto
|
||||
void updateTimeToLive(); // Actualiza el contador de tiempo de vida
|
||||
static auto getCoffeeMachineSpawn(int player_x, int item_width, int area_width, int margin = 2) -> int; // Calcula la zona de aparición de la máquina de café
|
||||
};
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
#pragma once
|
||||
|
||||
#include <string> // Para string, basic_string
|
||||
#include <utility>
|
||||
#include <utility> // Para move
|
||||
|
||||
// --- Namespace Lang: gestión de idiomas y textos ---
|
||||
namespace Lang {
|
||||
// --- Códigos de idioma soportados ---
|
||||
// --- Enums ---
|
||||
enum class Code : int {
|
||||
SPANISH = 0,
|
||||
VALENCIAN = 1,
|
||||
ENGLISH = 2
|
||||
SPANISH = 0, // Español
|
||||
VALENCIAN = 1, // Valenciano
|
||||
ENGLISH = 2 // Inglés
|
||||
};
|
||||
|
||||
// --- Estructura que representa un idioma ---
|
||||
// --- Estructuras ---
|
||||
struct Language {
|
||||
Code code; // Código que identifica al idioma
|
||||
std::string name; // Nombre que identifica el idioma
|
||||
@@ -21,7 +22,7 @@ struct Language {
|
||||
: code(c), name(std::move(n)), file_name(std::move(fn)) {}
|
||||
};
|
||||
|
||||
// --- Métodos ---
|
||||
// --- Funciones ---
|
||||
auto loadFromFile(const std::string &file_path) -> bool; // Carga los textos desde el fichero JSON especificado
|
||||
auto getText(const std::string &key) -> std::string; // Obtiene el texto por clave
|
||||
auto getNextLangCode(Code current_lang) -> Code; // Obtiene el código del siguiente idioma (circular)
|
||||
|
||||
@@ -3,15 +3,7 @@
|
||||
#include <string> // Para std::string
|
||||
#include <vector> // Para std::vector
|
||||
|
||||
/*
|
||||
Esta clase sirve para añadir elementos HiScoreEntry a un vector (tabla), de manera
|
||||
que la tabla siempre está ordenada.
|
||||
|
||||
Además tiene un método para dejar la tabla con sus valores iniciales y métodos para
|
||||
leer y escribir la tabla a un fichero.
|
||||
*/
|
||||
|
||||
// --- Estructura para las entradas de la tabla de records ---
|
||||
// --- Estructuras ---
|
||||
struct HiScoreEntry {
|
||||
std::string name; // Nombre
|
||||
int score; // Puntuación
|
||||
@@ -22,7 +14,8 @@ struct HiScoreEntry {
|
||||
: name(n.substr(0, 6)), score(s), one_credit_complete(occ) {}
|
||||
};
|
||||
|
||||
using Table = std::vector<HiScoreEntry>;
|
||||
// --- Tipos ---
|
||||
using Table = std::vector<HiScoreEntry>; // Tabla de puntuaciones
|
||||
|
||||
// --- Clase ManageHiScoreTable ---
|
||||
class ManageHiScoreTable {
|
||||
@@ -30,10 +23,10 @@ class ManageHiScoreTable {
|
||||
// --- Constantes ---
|
||||
static constexpr int NO_ENTRY = -1;
|
||||
|
||||
// Constructor y destructor
|
||||
explicit ManageHiScoreTable(Table &table)
|
||||
// --- Constructor y destructor ---
|
||||
explicit ManageHiScoreTable(Table &table) // Constructor con referencia a tabla
|
||||
: table_(table) {}
|
||||
~ManageHiScoreTable() = default;
|
||||
~ManageHiScoreTable() = default; // Destructor
|
||||
|
||||
// --- Métodos públicos ---
|
||||
void clear(); // Resetea la tabla a los valores por defecto
|
||||
|
||||
@@ -2,13 +2,14 @@
|
||||
|
||||
#include <SDL3/SDL.h> // Para Uint32, SDL_Event
|
||||
|
||||
// --- Namespace Mouse: gestión del ratón ---
|
||||
namespace Mouse {
|
||||
// --- Variables de estado del cursor ---
|
||||
extern Uint32 cursor_hide_time; // Tiempo en milisegundos para ocultar el cursor tras inactividad
|
||||
extern Uint32 last_mouse_move_time; // Última vez (en ms) que el ratón se movió
|
||||
extern bool cursor_visible; // Indica si el cursor está visible
|
||||
|
||||
// --- Gestión de eventos y visibilidad ---
|
||||
// --- Funciones ---
|
||||
void handleEvent(const SDL_Event &event); // Procesa eventos de ratón (movimiento, clic, etc.)
|
||||
void updateCursorVisibility(); // Actualiza la visibilidad del cursor según la inactividad
|
||||
} // namespace Mouse
|
||||
@@ -3,30 +3,28 @@
|
||||
#include "texture.h" // Para Texture
|
||||
|
||||
// Constructor
|
||||
MovingSprite::MovingSprite(std::shared_ptr<Texture> texture, SDL_FRect pos, Rotate rotate, float zoom_w, float zoom_h, SDL_FlipMode flip)
|
||||
MovingSprite::MovingSprite(std::shared_ptr<Texture> texture, SDL_FRect pos, Rotate rotate, float horizontal_zoom, float vertical_zoom, SDL_FlipMode flip)
|
||||
: Sprite(texture, pos),
|
||||
rotate_(rotate),
|
||||
flip_(flip),
|
||||
x_(pos.x),
|
||||
y_(pos.y),
|
||||
rotate_(rotate),
|
||||
horizontal_zoom_(zoom_w),
|
||||
vertical_zoom_(zoom_h),
|
||||
flip_(flip) {}
|
||||
horizontal_zoom_(horizontal_zoom),
|
||||
vertical_zoom_(vertical_zoom) {}
|
||||
|
||||
MovingSprite::MovingSprite(std::shared_ptr<Texture> texture, SDL_FRect pos)
|
||||
: Sprite(texture, pos),
|
||||
flip_(SDL_FLIP_NONE),
|
||||
x_(pos.x),
|
||||
y_(pos.y),
|
||||
|
||||
horizontal_zoom_(1.0F),
|
||||
vertical_zoom_(1.0F),
|
||||
flip_(SDL_FLIP_NONE) {}
|
||||
vertical_zoom_(1.0F) {}
|
||||
|
||||
MovingSprite::MovingSprite(std::shared_ptr<Texture> texture)
|
||||
: Sprite(texture),
|
||||
|
||||
flip_(SDL_FLIP_NONE),
|
||||
horizontal_zoom_(1.0F),
|
||||
vertical_zoom_(1.0F),
|
||||
flip_(SDL_FLIP_NONE) { Sprite::clear(); }
|
||||
vertical_zoom_(1.0F) { Sprite::clear(); }
|
||||
|
||||
// Reinicia todas las variables
|
||||
void MovingSprite::clear() {
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
|
||||
class Texture;
|
||||
|
||||
// Clase MovingSprite. Añade movimiento y efectos de rotación, zoom y flip al sprite
|
||||
// --- Clase MovingSprite: añade movimiento y efectos de rotación, zoom y flip al sprite ---
|
||||
class MovingSprite : public Sprite {
|
||||
public:
|
||||
// --- Estructura para la rotación ---
|
||||
// --- Estructuras ---
|
||||
struct Rotate {
|
||||
bool enabled{false}; // Indica si ha de rotar
|
||||
int counter{0}; // Contador
|
||||
@@ -25,7 +25,7 @@ class MovingSprite : public Sprite {
|
||||
};
|
||||
|
||||
// --- Constructores y destructor ---
|
||||
MovingSprite(std::shared_ptr<Texture> texture, SDL_FRect pos, MovingSprite::Rotate rotate, float zoom_w, float zoom_h, SDL_FlipMode flip);
|
||||
MovingSprite(std::shared_ptr<Texture> texture, SDL_FRect pos, MovingSprite::Rotate rotate, float horizontal_zoom, float vertical_zoom, SDL_FlipMode flip);
|
||||
MovingSprite(std::shared_ptr<Texture> texture, SDL_FRect pos);
|
||||
explicit MovingSprite(std::shared_ptr<Texture> texture);
|
||||
~MovingSprite() override = default;
|
||||
@@ -36,58 +36,48 @@ class MovingSprite : public Sprite {
|
||||
void stop(); // Elimina el movimiento del sprite
|
||||
void render() override; // Muestra el sprite por pantalla
|
||||
|
||||
// --- Getters de posición y movimiento ---
|
||||
[[nodiscard]] auto getPosX() const -> float { return x_; }
|
||||
[[nodiscard]] auto getPosY() const -> float { return y_; }
|
||||
[[nodiscard]] auto getVelX() const -> float { return vx_; }
|
||||
[[nodiscard]] auto getVelY() const -> float { return vy_; }
|
||||
[[nodiscard]] auto getAccelX() const -> float { return ax_; }
|
||||
[[nodiscard]] auto getAccelY() const -> float { return ay_; }
|
||||
|
||||
// --- Setters de movimiento ---
|
||||
void setVelX(float value) { vx_ = value; }
|
||||
void setVelY(float value) { vy_ = value; }
|
||||
void setAccelX(float value) { ax_ = value; }
|
||||
void setAccelY(float value) { ay_ = value; }
|
||||
|
||||
// --- Rotación ---
|
||||
[[nodiscard]] auto isRotating() const -> bool { return rotate_.enabled; }
|
||||
void setHorizontalZoom(float value) { horizontal_zoom_ = value; }
|
||||
void setVerticalZoom(float value) { vertical_zoom_ = value; }
|
||||
void setAngle(double value) { rotate_.angle = value; }
|
||||
void setRotatingCenter(SDL_FPoint point) { rotate_.center = point; }
|
||||
void setRotate(bool enable); // Activa o desactiva el efecto de rotación
|
||||
void setRotateSpeed(int value) { rotate_.speed = std::max(1, value); }
|
||||
void setRotateAmount(double value) { rotate_.amount = value; }
|
||||
void switchRotate() { rotate_.amount *= -1; } // Cambia el sentido de la rotación
|
||||
|
||||
// --- Flip ---
|
||||
void setFlip(SDL_FlipMode flip) { flip_ = flip; }
|
||||
void flip() { flip_ = (flip_ == SDL_FLIP_HORIZONTAL) ? SDL_FLIP_NONE : SDL_FLIP_HORIZONTAL; }
|
||||
auto getFlip() -> SDL_FlipMode { return flip_; }
|
||||
|
||||
// --- Posición y tamaño ---
|
||||
// --- Configuración ---
|
||||
void setPos(SDL_FRect rect); // Establece la posición y el tamaño del objeto
|
||||
void setPos(float pos_x, float pos_y); // Establece la posición del objeto
|
||||
void setPosX(float pos_x); // Establece la posición X
|
||||
void setPosY(float pos_y); // Establece la posición Y
|
||||
void setVelX(float value) { vx_ = value; } // Establece la velocidad X
|
||||
void setVelY(float value) { vy_ = value; } // Establece la velocidad Y
|
||||
void setAccelX(float value) { ax_ = value; } // Establece la aceleración X
|
||||
void setAccelY(float value) { ay_ = value; } // Establece la aceleración Y
|
||||
void setHorizontalZoom(float value) { horizontal_zoom_ = value; } // Establece el zoom horizontal
|
||||
void setVerticalZoom(float value) { vertical_zoom_ = value; } // Establece el zoom vertical
|
||||
void setAngle(double value) { rotate_.angle = value; } // Establece el ángulo
|
||||
void setRotatingCenter(SDL_FPoint point) { rotate_.center = point; } // Establece el centro de rotación
|
||||
void setRotate(bool enable); // Activa o desactiva el efecto de rotación
|
||||
void setRotateSpeed(int value) { rotate_.speed = std::max(1, value); } // Establece la velocidad de rotación
|
||||
void setRotateAmount(double value) { rotate_.amount = value; } // Establece la cantidad de rotación
|
||||
void switchRotate() { rotate_.amount *= -1; } // Cambia el sentido de la rotación
|
||||
void setFlip(SDL_FlipMode flip) { flip_ = flip; } // Establece el flip
|
||||
void flip() { flip_ = (flip_ == SDL_FLIP_HORIZONTAL) ? SDL_FLIP_NONE : SDL_FLIP_HORIZONTAL; } // Cambia el flip
|
||||
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto getPosX() const -> float { return x_; } // Obtiene la posición X
|
||||
[[nodiscard]] auto getPosY() const -> float { return y_; } // Obtiene la posición Y
|
||||
[[nodiscard]] auto getVelX() const -> float { return vx_; } // Obtiene la velocidad X
|
||||
[[nodiscard]] auto getVelY() const -> float { return vy_; } // Obtiene la velocidad Y
|
||||
[[nodiscard]] auto getAccelX() const -> float { return ax_; } // Obtiene la aceleración X
|
||||
[[nodiscard]] auto getAccelY() const -> float { return ay_; } // Obtiene la aceleración Y
|
||||
[[nodiscard]] auto isRotating() const -> bool { return rotate_.enabled; } // Verifica si está rotando
|
||||
auto getFlip() -> SDL_FlipMode { return flip_; } // Obtiene el flip
|
||||
|
||||
protected:
|
||||
// --- Variables de posición y movimiento ---
|
||||
// --- Variables de estado ---
|
||||
Rotate rotate_; // Variables usadas para controlar la rotación del sprite
|
||||
SDL_FlipMode flip_; // Indica cómo se voltea el sprite
|
||||
float x_ = 0.0F; // Posición en el eje X
|
||||
float y_ = 0.0F; // Posición en el eje Y
|
||||
|
||||
float vx_ = 0.0F; // Velocidad en el eje X. Cantidad de píxeles a desplazarse
|
||||
float vy_ = 0.0F; // Velocidad en el eje Y. Cantidad de píxeles a desplazarse
|
||||
|
||||
float ax_ = 0.0F; // Aceleración en el eje X. Variación de la velocidad
|
||||
float ay_ = 0.0F; // Aceleración en el eje Y. Variación de la velocidad
|
||||
|
||||
// --- Efectos visuales ---
|
||||
Rotate rotate_; // Variables usadas para controlar la rotación del sprite
|
||||
float vx_ = 0.0F; // Velocidad en el eje X
|
||||
float vy_ = 0.0F; // Velocidad en el eje Y
|
||||
float ax_ = 0.0F; // Aceleración en el eje X
|
||||
float ay_ = 0.0F; // Aceleración en el eje Y
|
||||
float horizontal_zoom_; // Zoom aplicado a la anchura
|
||||
float vertical_zoom_; // Zoom aplicado a la altura
|
||||
SDL_FlipMode flip_; // Indica cómo se voltea el sprite
|
||||
|
||||
// --- Métodos internos ---
|
||||
void updateAngle() { rotate_.angle += rotate_.amount; } // Incrementa el valor del ángulo
|
||||
|
||||
@@ -19,9 +19,10 @@
|
||||
#include "manage_hiscore_table.h" // Para ManageHiScoreTable, Table
|
||||
#include "player.h" // Para Player
|
||||
|
||||
// --- Namespace Options: gestión de configuración y opciones del juego ---
|
||||
namespace Options {
|
||||
|
||||
// --- Opciones de ventana ---
|
||||
// --- Estructuras ---
|
||||
struct Window {
|
||||
std::string caption; // Texto que aparece en la barra de título de la ventana
|
||||
int zoom{2}; // Valor por el que se multiplica el tamaño de la ventana
|
||||
@@ -32,7 +33,6 @@ struct Window {
|
||||
: caption("Coffee Crisis Arcade Edition") {}
|
||||
};
|
||||
|
||||
// --- Opciones de vídeo ---
|
||||
struct Video {
|
||||
SDL_ScaleMode scale_mode{SDL_ScaleMode::SDL_SCALEMODE_NEAREST}; // Filtro usado para el escalado de la imagen
|
||||
bool fullscreen{false}; // Indica si se usa pantalla completa
|
||||
@@ -45,7 +45,6 @@ struct Video {
|
||||
Video() = default;
|
||||
};
|
||||
|
||||
// --- Opciones de música ---
|
||||
struct Music {
|
||||
bool enabled{true}; // Indica si la música suena o no
|
||||
int volume{100}; // Volumen de la música
|
||||
@@ -54,7 +53,6 @@ struct Music {
|
||||
Music() = default;
|
||||
};
|
||||
|
||||
// --- Opciones de sonido ---
|
||||
struct Sound {
|
||||
bool enabled{true}; // Indica si los sonidos suenan o no
|
||||
int volume{100}; // Volumen de los sonidos
|
||||
@@ -63,7 +61,6 @@ struct Sound {
|
||||
Sound() = default;
|
||||
};
|
||||
|
||||
// --- Opciones de audio ---
|
||||
struct Audio {
|
||||
Music music; // Opciones para la música
|
||||
Sound sound; // Opciones para los efectos de sonido
|
||||
@@ -74,7 +71,6 @@ struct Audio {
|
||||
Audio() = default;
|
||||
};
|
||||
|
||||
// --- Opciones de configuración ---
|
||||
struct Settings {
|
||||
Difficulty::Code difficulty{Difficulty::Code::NORMAL}; // Dificultad del juego
|
||||
Lang::Code language{Lang::Code::VALENCIAN}; // Idioma usado en el juego
|
||||
@@ -96,7 +92,6 @@ struct Settings {
|
||||
}
|
||||
};
|
||||
|
||||
// --- Estructura para gamepad individual ---
|
||||
struct Gamepad {
|
||||
std::shared_ptr<Input::Gamepad> instance = nullptr; // Referencia al mando
|
||||
std::string name; // Nombre del mando
|
||||
@@ -107,7 +102,7 @@ struct Gamepad {
|
||||
: player_id(custom_player_id) {}
|
||||
};
|
||||
|
||||
// --- Manager para los gamepads ---
|
||||
// --- Clases ---
|
||||
class GamepadManager {
|
||||
public:
|
||||
void init() {
|
||||
@@ -291,7 +286,6 @@ struct Keyboard {
|
||||
}
|
||||
};
|
||||
|
||||
// --- Opciones pendientes de aplicar ---
|
||||
struct PendingChanges {
|
||||
Lang::Code new_language{Lang::Code::VALENCIAN}; // Idioma en espera de aplicar
|
||||
Difficulty::Code new_difficulty{Difficulty::Code::NORMAL}; // Dificultad en espera de aplicar
|
||||
@@ -301,7 +295,7 @@ struct PendingChanges {
|
||||
PendingChanges() = default;
|
||||
};
|
||||
|
||||
// --- Variables globales ---
|
||||
// --- Variables ---
|
||||
extern Window window; // Opciones de la ventana
|
||||
extern Settings settings; // Opciones del juego
|
||||
extern Video video; // Opciones de vídeo
|
||||
@@ -310,7 +304,7 @@ extern GamepadManager gamepad_manager; // Manager de mandos para cada jugador
|
||||
extern Keyboard keyboard; // Opciones para el teclado
|
||||
extern PendingChanges pending_changes; // Opciones que se aplican al cerrar
|
||||
|
||||
// --- Funciones de configuración ---
|
||||
// --- Funciones ---
|
||||
void init(); // Inicializa las opciones del programa
|
||||
void setConfigFile(const std::string& file_path); // Establece el fichero de configuración
|
||||
void setControllersFile(const std::string& file_path); // Establece el fichero de configuración de mandos
|
||||
|
||||
@@ -187,7 +187,7 @@ struct ParamPlayer {
|
||||
Color::fromHex(GameDefaults::Player::TwoCoffeeShirt::PLAYER1_LIGHT))}};
|
||||
};
|
||||
|
||||
// --- Estructura principal para almacenar todos los parámetros del juego ---
|
||||
// --- Estructura Param: almacena todos los parámetros del juego ---
|
||||
struct Param {
|
||||
ParamGame game;
|
||||
ParamFade fade;
|
||||
@@ -220,8 +220,8 @@ struct Param {
|
||||
void precalculateZones();
|
||||
};
|
||||
|
||||
// --- Variable global con los parámetros del juego ---
|
||||
extern Param param;
|
||||
// --- Variables ---
|
||||
extern Param param; // Variable global con los parámetros del juego
|
||||
|
||||
// --- Funciones globales ---
|
||||
void loadParamsFromFile(const std::string& file_path);
|
||||
// --- Funciones ---
|
||||
void loadParamsFromFile(const std::string& file_path); // Carga parámetros desde archivo
|
||||
@@ -10,21 +10,20 @@
|
||||
|
||||
class Texture;
|
||||
|
||||
// --- Tipos de recorrido ---
|
||||
enum class PathType {
|
||||
// --- Enums ---
|
||||
enum class PathType { // Tipos de recorrido
|
||||
VERTICAL,
|
||||
HORIZONTAL,
|
||||
};
|
||||
|
||||
// --- Centrado del recorrido ---
|
||||
enum class PathCentered {
|
||||
enum class PathCentered { // Centrado del recorrido
|
||||
ON_X,
|
||||
ON_Y,
|
||||
NONE,
|
||||
};
|
||||
|
||||
// --- Estructura Path: define un recorrido para el sprite ---
|
||||
struct Path {
|
||||
// --- Estructuras ---
|
||||
struct Path { // Define un recorrido para el sprite
|
||||
std::vector<SDL_FPoint> spots; // Puntos por los que se desplazará el sprite
|
||||
int waiting_counter; // Tiempo de espera una vez en el destino
|
||||
bool on_destination = false; // Indica si ha llegado al destino
|
||||
@@ -36,8 +35,8 @@ struct Path {
|
||||
: spots(spots_init), waiting_counter(waiting_counter_init) {}
|
||||
};
|
||||
|
||||
// Devuelve un vector con los puntos que conforman la ruta
|
||||
auto createPath(float start, float end, PathType type, float fixed_pos, int steps, const std::function<double(double)> &easing_function) -> std::vector<SDL_FPoint>;
|
||||
// --- Funciones ---
|
||||
auto createPath(float start, float end, PathType type, float fixed_pos, int steps, const std::function<double(double)> &easing_function) -> std::vector<SDL_FPoint>; // Devuelve un vector con los puntos que conforman la ruta
|
||||
|
||||
// --- Clase PathSprite: Sprite que sigue uno o varios recorridos ---
|
||||
class PathSprite : public Sprite {
|
||||
|
||||
@@ -5,18 +5,18 @@
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
// Clase dedicada para manejar el sistema de pausa
|
||||
// --- Clase PauseManager: maneja el sistema de pausa del juego ---
|
||||
class PauseManager {
|
||||
public:
|
||||
// Enum encapsulado dentro de la clase
|
||||
enum class Source : uint8_t {
|
||||
// --- Enums ---
|
||||
enum class Source : uint8_t { // Fuentes de pausa
|
||||
NONE = 0,
|
||||
PLAYER = 1 << 0, // 0001
|
||||
SERVICE_MENU = 1 << 1, // 0010
|
||||
FOCUS_LOST = 1 << 2 // 0100
|
||||
};
|
||||
|
||||
// Operadores para trabajar con las banderas (funciones friend)
|
||||
// --- Operadores friend ---
|
||||
friend auto operator|(Source a, Source b) -> Source {
|
||||
return static_cast<Source>(static_cast<uint8_t>(a) | static_cast<uint8_t>(b));
|
||||
}
|
||||
@@ -42,27 +42,12 @@ class PauseManager {
|
||||
return a = a & b;
|
||||
}
|
||||
|
||||
private:
|
||||
Source flags_ = Source::NONE;
|
||||
std::function<void(bool)> on_pause_changed_callback_;
|
||||
|
||||
[[nodiscard]] auto hasFlag(Source flag) const -> bool {
|
||||
return (flags_ & flag) != Source::NONE;
|
||||
}
|
||||
|
||||
void notifyPauseChanged() {
|
||||
if (on_pause_changed_callback_) {
|
||||
on_pause_changed_callback_(isPaused());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
// Constructor con callback opcional
|
||||
explicit PauseManager(std::function<void(bool)> callback = nullptr)
|
||||
// --- Constructor y destructor ---
|
||||
explicit PauseManager(std::function<void(bool)> callback = nullptr) // Constructor con callback opcional
|
||||
: on_pause_changed_callback_(std::move(callback)) {}
|
||||
|
||||
// Establece/quita una fuente de pausa específica
|
||||
void setFlag(Source source, bool enable) {
|
||||
// --- Métodos principales ---
|
||||
void setFlag(Source source, bool enable) { // Establece/quita una fuente de pausa específica
|
||||
bool was_paused = isPaused();
|
||||
|
||||
if (enable) {
|
||||
@@ -76,33 +61,29 @@ class PauseManager {
|
||||
}
|
||||
}
|
||||
|
||||
// Métodos específicos para cada fuente
|
||||
// --- Métodos específicos para cada fuente ---
|
||||
void setPlayerPause(bool enable) { setFlag(Source::PLAYER, enable); }
|
||||
void setServiceMenuPause(bool enable) { setFlag(Source::SERVICE_MENU, enable); }
|
||||
void setFocusLossPause(bool enable) { setFlag(Source::FOCUS_LOST, enable); }
|
||||
|
||||
// Toggle para el jugador (más común)
|
||||
void togglePlayerPause() { setPlayerPause(!isPlayerPaused()); }
|
||||
void togglePlayerPause() { setPlayerPause(!isPlayerPaused()); } // Toggle para el jugador (más común)
|
||||
|
||||
// Getters
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto isPaused() const -> bool { return flags_ != Source::NONE; }
|
||||
[[nodiscard]] auto isPlayerPaused() const -> bool { return hasFlag(Source::PLAYER); }
|
||||
[[nodiscard]] auto isServiceMenuPaused() const -> bool { return hasFlag(Source::SERVICE_MENU); }
|
||||
[[nodiscard]] auto isFocusLossPaused() const -> bool { return hasFlag(Source::FOCUS_LOST); }
|
||||
|
||||
// Obtiene las banderas actuales
|
||||
[[nodiscard]] auto getFlags() const -> Source { return flags_; }
|
||||
[[nodiscard]] auto getFlags() const -> Source { return flags_; } // Obtiene las banderas actuales
|
||||
|
||||
// Limpia todas las pausas (útil para reset)
|
||||
void clearAll() {
|
||||
// --- Métodos de utilidad ---
|
||||
void clearAll() { // Limpia todas las pausas (útil para reset)
|
||||
if (isPaused()) {
|
||||
flags_ = Source::NONE;
|
||||
notifyPauseChanged();
|
||||
}
|
||||
}
|
||||
|
||||
// Método para debug
|
||||
[[nodiscard]] auto getStatusString() const -> std::string {
|
||||
[[nodiscard]] auto getStatusString() const -> std::string { // Método para debug
|
||||
if (flags_ == Source::NONE) {
|
||||
return "Active";
|
||||
}
|
||||
@@ -133,9 +114,22 @@ class PauseManager {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Permite cambiar el callback en runtime
|
||||
void setCallback(std::function<void(bool)> callback) {
|
||||
void setCallback(std::function<void(bool)> callback) { // Permite cambiar el callback en runtime
|
||||
on_pause_changed_callback_ = callback;
|
||||
}
|
||||
|
||||
private:
|
||||
// --- Variables ---
|
||||
Source flags_ = Source::NONE;
|
||||
std::function<void(bool)> on_pause_changed_callback_;
|
||||
|
||||
// --- Métodos internos ---
|
||||
[[nodiscard]] auto hasFlag(Source flag) const -> bool {
|
||||
return (flags_ & flag) != Source::NONE;
|
||||
}
|
||||
void notifyPauseChanged() {
|
||||
if (on_pause_changed_callback_) {
|
||||
on_pause_changed_callback_(isPaused());
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -24,15 +24,14 @@ class Player {
|
||||
static constexpr int WIDTH = 32; // Anchura
|
||||
static constexpr int HEIGHT = 32; // Altura
|
||||
|
||||
// --- Id para los jugadores ---
|
||||
// --- Enums ---
|
||||
enum class Id : int {
|
||||
NO_PLAYER = -1,
|
||||
BOTH_PLAYERS = 0,
|
||||
PLAYER1 = 1,
|
||||
PLAYER2 = 2
|
||||
NO_PLAYER = -1, // Sin jugador
|
||||
BOTH_PLAYERS = 0, // Ambos jugadores
|
||||
PLAYER1 = 1, // Jugador 1
|
||||
PLAYER2 = 2 // Jugador 2
|
||||
};
|
||||
|
||||
// --- Estados posibles del jugador ---
|
||||
enum class State {
|
||||
// Estados de movimiento
|
||||
WALKING_LEFT, // Caminando hacia la izquierda
|
||||
@@ -76,17 +75,18 @@ class Player {
|
||||
RESPAWNING, // Tras continuar y dar las gracias, otorga inmunidad y vuelve al juego
|
||||
};
|
||||
|
||||
// --- Estructuras ---
|
||||
struct Config {
|
||||
Id id;
|
||||
float x;
|
||||
int y;
|
||||
bool demo;
|
||||
SDL_FRect *play_area; // Usamos puntero para mantener la referencia
|
||||
std::vector<std::shared_ptr<Texture>> texture;
|
||||
std::vector<std::vector<std::string>> animations;
|
||||
Table *hi_score_table; // También como puntero para referencia
|
||||
int *glowing_entry; // Puntero para mantener la referencia
|
||||
IStageInfo *stage_info; // Puntero para el gestor de pantallas
|
||||
Id id; // Identificador del jugador
|
||||
float x; // Posición X inicial
|
||||
int y; // Posición Y inicial
|
||||
bool demo; // Modo demo
|
||||
SDL_FRect *play_area; // Área de juego (puntero para mantener referencia)
|
||||
std::vector<std::shared_ptr<Texture>> texture; // Texturas del jugador
|
||||
std::vector<std::vector<std::string>> animations; // Animaciones del jugador
|
||||
Table *hi_score_table; // Tabla de puntuaciones (puntero para referencia)
|
||||
int *glowing_entry; // Entrada brillante (puntero para mantener referencia)
|
||||
IStageInfo *stage_info; // Gestor de pantallas (puntero)
|
||||
};
|
||||
|
||||
// --- Constructor y destructor ---
|
||||
@@ -208,25 +208,25 @@ class Player {
|
||||
Table *hi_score_table_ = nullptr; // Tabla de máximas puntuaciones
|
||||
int *glowing_entry_ = nullptr; // Entrada de la tabla de puntuaciones para hacerla brillar
|
||||
IStageInfo *stage_info_; // Informacion de la pantalla actual
|
||||
std::string name_; // Nombre del jugador
|
||||
std::string last_enter_name_; // Último nombre introducido en la tabla de puntuaciones
|
||||
|
||||
// --- Estructuras y enums ---
|
||||
// --- Variables de estado ---
|
||||
SDL_FRect play_area_; // Rectángulo con la zona de juego
|
||||
Circle collider_ = Circle(0, 0, 9); // Círculo de colisión del jugador
|
||||
std::string name_; // Nombre del jugador
|
||||
std::string last_enter_name_; // Último nombre introducido en la tabla de puntuaciones
|
||||
Scoreboard::Id scoreboard_panel_ = Scoreboard::Id::LEFT; // Panel del marcador asociado al jugador
|
||||
Id id_; // Identificador para el jugador
|
||||
State walking_state_ = State::WALKING_STOP; // Estado del jugador al moverse
|
||||
State firing_state_ = State::FIRING_NONE; // Estado del jugador al disparar
|
||||
State playing_state_ = State::WAITING; // Estado del jugador en el juego
|
||||
|
||||
// --- Variables float ---
|
||||
Uint32 continue_ticks_ = 0; // Variable para poder cambiar el contador de continue en función del tiempo
|
||||
Uint32 name_entry_ticks_ = 0; // Variable para poder cambiar el contador de poner nombre en función del tiempo
|
||||
Uint32 showing_name_ticks_ = 0; // Tiempo en el que se entra al estado SHOWING_NAME
|
||||
float pos_x_ = 0.0F; // Posición en el eje X
|
||||
float default_pos_x_; // Posición inicial para el jugador
|
||||
float vel_x_ = 0.0F; // Cantidad de píxeles a desplazarse en el eje X
|
||||
float score_multiplier_ = 1.0F; // Multiplicador de puntos
|
||||
|
||||
// --- Variables int ---
|
||||
int pos_y_ = 0; // Posición en el eje Y
|
||||
int default_pos_y_; // Posición inicial para el jugador
|
||||
int vel_y_ = 0; // Cantidad de píxeles a desplazarse en el eje Y
|
||||
@@ -246,13 +246,6 @@ class Player {
|
||||
int step_counter_ = 0; // Cuenta los pasos para los estados en los que camina automáticamente
|
||||
int credits_used_ = 0; // Indica el número de veces que ha continuado
|
||||
int waiting_counter_ = 0; // Contador para el estado de espera
|
||||
|
||||
// --- Variables Uint32 ---
|
||||
Uint32 continue_ticks_ = 0; // Variable para poder cambiar el contador de continue en función del tiempo
|
||||
Uint32 name_entry_ticks_ = 0; // Variable para poder cambiar el contador de poner nombre en función del tiempo
|
||||
Uint32 showing_name_ticks_ = 0; // Tiempo en el que se entra al estado SHOWING_NAME
|
||||
|
||||
// --- Flags booleanas ---
|
||||
bool qualifies_for_high_score_ = false; // Indica si tiene una puntuación que le permite entrar en la tabla de records
|
||||
bool invulnerable_ = true; // Indica si el jugador es invulnerable
|
||||
bool extra_hit_ = false; // Indica si el jugador tiene un toque extra
|
||||
|
||||
@@ -38,7 +38,7 @@ class Scoreboard {
|
||||
NUM_MODES,
|
||||
};
|
||||
|
||||
// --- Structs ---
|
||||
// --- Estructuras ---
|
||||
struct Panel {
|
||||
Mode mode; // Modo en el que se encuentra el panel
|
||||
SDL_FRect pos; // Posición donde dibujar el panel dentro del marcador
|
||||
@@ -80,22 +80,21 @@ class Scoreboard {
|
||||
// --- Variables de estado ---
|
||||
std::array<std::string, static_cast<int>(Id::SIZE)> name_ = {}; // Nombre de cada jugador
|
||||
std::array<std::string, static_cast<int>(Id::SIZE)> record_name_ = {}; // Nombre introducido para la tabla de records
|
||||
std::array<Panel, static_cast<int>(Id::SIZE)> panel_ = {}; // Lista con todos los paneles del marcador
|
||||
std::vector<Color> name_colors_; // Colores para destacar el nombre una vez introducido
|
||||
std::string hi_score_name_; // Nombre del jugador con la máxima puntuación
|
||||
SDL_FRect rect_ = {0, 0, 320, 40}; // Posición y dimensiones del marcador
|
||||
Color color_; // Color del marcador
|
||||
std::array<size_t, static_cast<int>(Id::SIZE)> selector_pos_ = {}; // Posición del selector de letra para introducir el nombre
|
||||
std::array<int, static_cast<int>(Id::SIZE)> score_ = {}; // Puntuación de los jugadores
|
||||
std::array<float, static_cast<int>(Id::SIZE)> mult_ = {}; // Multiplicador de los jugadores
|
||||
std::array<int, static_cast<int>(Id::SIZE)> continue_counter_ = {}; // Tiempo para continuar de los jugadores
|
||||
std::array<Panel, static_cast<int>(Id::SIZE)> panel_ = {}; // Lista con todos los paneles del marcador
|
||||
|
||||
std::array<float, static_cast<int>(Id::SIZE)> mult_ = {}; // Multiplicador de los jugadores
|
||||
Uint64 ticks_ = SDL_GetTicks(); // Variable donde almacenar el valor de SDL_GetTicks()
|
||||
int stage_ = 1; // Número de fase actual
|
||||
int hi_score_ = 0; // Máxima puntuación
|
||||
float power_ = 0; // Poder actual de la fase
|
||||
std::string hi_score_name_; // Nombre del jugador con la máxima puntuación
|
||||
Color color_; // Color del marcador
|
||||
SDL_FRect rect_ = {0, 0, 320, 40}; // Posición y dimensiones del marcador
|
||||
Uint64 ticks_ = SDL_GetTicks(); // Variable donde almacenar el valor de SDL_GetTicks()
|
||||
int time_counter_ = 0; // Contador de segundos
|
||||
int loop_counter_ = 0; // Contador de bucle
|
||||
std::vector<Color> name_colors_; // Colores para destacar el nombre una vez introducido
|
||||
float power_ = 0; // Poder actual de la fase
|
||||
|
||||
// --- Variables de aspecto ---
|
||||
Color text_color1_, text_color2_; // Colores para los marcadores del texto;
|
||||
@@ -126,10 +125,10 @@ class Scoreboard {
|
||||
void renderShowNameMode(size_t panel_index);
|
||||
void renderGameCompletedMode(size_t panel_index);
|
||||
|
||||
// --- Constructor y destructor privados (singleton) ---
|
||||
Scoreboard();
|
||||
~Scoreboard();
|
||||
// --- Constructores y destructor privados (singleton) ---
|
||||
Scoreboard(); // Constructor privado
|
||||
~Scoreboard(); // Destructor privado
|
||||
|
||||
// --- Singleton ---
|
||||
static Scoreboard *instance;
|
||||
// --- Instancia singleton ---
|
||||
static Scoreboard *instance; // Instancia única de Scoreboard
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@ class Notifier;
|
||||
class ServiceMenu;
|
||||
class Text;
|
||||
|
||||
// Clase Screen: gestiona la ventana, el renderizador y los efectos visuales globales
|
||||
// --- Clase Screen: gestiona la ventana, el renderizador y los efectos visuales globales (singleton) ---
|
||||
class Screen {
|
||||
public:
|
||||
// --- Métodos de singleton ---
|
||||
@@ -62,9 +62,9 @@ class Screen {
|
||||
|
||||
private:
|
||||
// --- Constantes ---
|
||||
static constexpr int WINDOWS_DECORATIONS = 35;
|
||||
static constexpr int WINDOWS_DECORATIONS = 35; // Decoraciones de la ventana
|
||||
|
||||
// --- Estructuras internas ---
|
||||
// --- Estructuras privadas ---
|
||||
struct FPS {
|
||||
Uint32 ticks{0}; // Tiempo en milisegundos desde que se comenzó a contar.
|
||||
int frame_count{0}; // Número acumulado de frames en el intervalo.
|
||||
@@ -170,21 +170,19 @@ class Screen {
|
||||
|
||||
#endif
|
||||
|
||||
// --- Singleton ---
|
||||
static Screen *instance;
|
||||
|
||||
// --- Objetos y punteros ---
|
||||
SDL_Window *window_; // Ventana de la aplicación
|
||||
SDL_Renderer *renderer_; // El renderizador de la ventana
|
||||
SDL_Texture *game_canvas_; // Textura donde se dibuja todo antes de volcarse al renderizador
|
||||
ServiceMenu *service_menu_; // Objeto para mostrar el menú de servicio
|
||||
Notifier *notifier_; // Objeto para mostrar las notificaciones por pantalla
|
||||
std::shared_ptr<Text> text_; // Objeto para escribir texto en pantalla
|
||||
|
||||
// --- Variables de estado ---
|
||||
SDL_FRect src_rect_; // Coordenadas de origen para dibujar la textura del juego
|
||||
SDL_FRect dst_rect_; // Coordenadas destino para dibujar la textura del juego
|
||||
FPS fps_; // Gestión de frames por segundo
|
||||
std::string shader_source_; // Almacena el contenido del archivo GLSL
|
||||
FPS fps_; // Gestión de frames por segundo
|
||||
FlashEffect flash_effect_; // Efecto de flash en pantalla
|
||||
ShakeEffect shake_effect_; // Efecto de agitar la pantalla
|
||||
bool attenuate_effect_ = false; // Indica si la pantalla ha de estar atenuada
|
||||
@@ -192,9 +190,6 @@ class Screen {
|
||||
Debug debug_info_; // Información de debug
|
||||
#endif
|
||||
|
||||
// --- Texto ---
|
||||
std::shared_ptr<Text> text_; // Objeto para escribir texto en pantalla
|
||||
|
||||
// --- Métodos internos ---
|
||||
auto initSDLVideo() -> bool; // Arranca SDL VIDEO y crea la ventana
|
||||
void renderFlash(); // Dibuja el efecto de flash en la pantalla
|
||||
@@ -208,7 +203,10 @@ class Screen {
|
||||
void renderAttenuate(); // Atenúa la pantalla
|
||||
void createText(); // Crea el objeto de texto
|
||||
|
||||
// --- Constructores y destructor ---
|
||||
Screen();
|
||||
~Screen();
|
||||
// --- Constructores y destructor privados (singleton) ---
|
||||
Screen(); // Constructor privado
|
||||
~Screen(); // Destructor privado
|
||||
|
||||
// --- Instancia singleton ---
|
||||
static Screen *instance; // Instancia única de Screen
|
||||
};
|
||||
@@ -33,29 +33,29 @@ namespace Difficulty {
|
||||
enum class Code;
|
||||
} // namespace Difficulty
|
||||
|
||||
// Clase Game
|
||||
// --- Clase Game: gestor principal del juego ---
|
||||
class Game {
|
||||
public:
|
||||
// --- Constantes ---
|
||||
static constexpr bool DEMO_OFF = false;
|
||||
static constexpr bool DEMO_ON = true;
|
||||
static constexpr bool DEMO_OFF = false; // Modo demo desactivado
|
||||
static constexpr bool DEMO_ON = true; // Modo demo activado
|
||||
|
||||
// --- Constructor y destructor ---
|
||||
Game(Player::Id player_id, int current_stage, bool demo);
|
||||
~Game();
|
||||
Game(Player::Id player_id, int current_stage, bool demo); // Constructor principal
|
||||
~Game(); // Destructor
|
||||
|
||||
// --- Bucle principal ---
|
||||
void run();
|
||||
void run(); // Ejecuta el bucle principal del juego
|
||||
|
||||
private:
|
||||
// --- Tipos internos ---
|
||||
// --- Enums ---
|
||||
enum class State {
|
||||
FADE_IN,
|
||||
ENTERING_PLAYER,
|
||||
SHOWING_GET_READY_MESSAGE,
|
||||
PLAYING,
|
||||
COMPLETED,
|
||||
GAME_OVER,
|
||||
FADE_IN, // Transición de entrada
|
||||
ENTERING_PLAYER, // Jugador entrando
|
||||
SHOWING_GET_READY_MESSAGE, // Mostrando mensaje de preparado
|
||||
PLAYING, // Jugando
|
||||
COMPLETED, // Juego completado
|
||||
GAME_OVER, // Fin del juego
|
||||
};
|
||||
|
||||
// --- Constantes internas ---
|
||||
|
||||
@@ -14,17 +14,13 @@ class Fade;
|
||||
class Sprite;
|
||||
enum class FadeMode : Uint8;
|
||||
|
||||
/*
|
||||
Esta clase gestiona un estado del programa. Se encarga de mostrar la tabla con las puntuaciones
|
||||
más altas. Para ello utiliza un objeto que se encarga de pintar el fondo y una textura
|
||||
sobre la que escribe las puntuaciones. Esta textura se recorre modificando la ventana de vista
|
||||
para dar el efecto de que la textura se mueve sobre la pantalla.
|
||||
|
||||
Para mejorar la legibilidad de los textos, el objeto que dibuja el fondo es capaz de modificar
|
||||
su atenuación.
|
||||
*/
|
||||
|
||||
// Clase HiScoreTable
|
||||
// --- Clase HiScoreTable: muestra la tabla de puntuaciones más altas ---
|
||||
// Esta clase gestiona un estado del programa. Se encarga de mostrar la tabla con las puntuaciones
|
||||
// más altas. Para ello utiliza un objeto que se encarga de pintar el fondo y una textura
|
||||
// sobre la que escribe las puntuaciones. Esta textura se recorre modificando la ventana de vista
|
||||
// para dar el efecto de que la textura se mueve sobre la pantalla.
|
||||
// Para mejorar la legibilidad de los textos, el objeto que dibuja el fondo es capaz de modificar
|
||||
// su atenuación.
|
||||
class HiScoreTable {
|
||||
public:
|
||||
// --- Constructor y destructor ---
|
||||
|
||||
@@ -25,8 +25,8 @@ class TiledBG;
|
||||
por la pantalla sobre el mosaico de fondo (gestionado por el correspondiente objeto).
|
||||
*/
|
||||
|
||||
// Estructura para almacenar información de línea animada
|
||||
struct Line {
|
||||
// --- Estructuras ---
|
||||
struct Line { // Almacena información de línea animada
|
||||
int y; // Coordenada Y de la línea
|
||||
float x; // Coordenada X inicial (usamos float para mayor precisión en el suavizado)
|
||||
int direction; // Dirección de movimiento: -1 para izquierda, 1 para derecha
|
||||
|
||||
@@ -11,12 +11,9 @@
|
||||
#include "tiled_bg.h" // Para TiledBG
|
||||
#include "writer.h" // Para Writer
|
||||
|
||||
/*
|
||||
Esta clase gestiona un estado del programa. Se encarga de mostrar la secuencia
|
||||
de introducción.
|
||||
*/
|
||||
|
||||
// Clase Intro
|
||||
// --- Clase Intro: muestra la secuencia de introducción ---
|
||||
// Esta clase gestiona un estado del programa. Se encarga de mostrar la secuencia
|
||||
// de introducción.
|
||||
class Intro {
|
||||
public:
|
||||
// --- Constructor y destructor ---
|
||||
|
||||
@@ -10,15 +10,12 @@
|
||||
|
||||
class Texture;
|
||||
|
||||
/*
|
||||
Esta clase gestiona un estado del programa. Se encarga de dibujar por pantalla el
|
||||
logo de "JAILGAMES" utilizando un sencillo efecto consistente en generar un sprite por
|
||||
cada línea del bitmap que forma la palabra "JAILGAMES". Posteriormente realiza una
|
||||
modulación de color sobre la textura para simular un fade to black al estilo
|
||||
ZX Spectrum.
|
||||
*/
|
||||
|
||||
// --- Clase Logo ---
|
||||
// --- Clase Logo: dibuja el logo de JAILGAMES con efectos visuales ---
|
||||
// Esta clase gestiona un estado del programa. Se encarga de dibujar por pantalla el
|
||||
// logo de "JAILGAMES" utilizando un sencillo efecto consistente en generar un sprite por
|
||||
// cada línea del bitmap que forma la palabra "JAILGAMES". Posteriormente realiza una
|
||||
// modulación de color sobre la textura para simular un fade to black al estilo
|
||||
// ZX Spectrum.
|
||||
class Logo {
|
||||
public:
|
||||
// --- Constructor y destructor ---
|
||||
|
||||
@@ -42,8 +42,8 @@ Title::Title()
|
||||
tiled_bg_(std::make_unique<TiledBG>(param.game.game_area.rect, TiledBGMode::RANDOM)),
|
||||
game_logo_(std::make_unique<GameLogo>(param.game.game_area.center_x, param.title.title_c_c_position)),
|
||||
mini_logo_sprite_(std::make_unique<Sprite>(Resource::get()->getTexture("logo_jailgames_mini.png"))),
|
||||
num_controllers_(Input::get()->getNumGamepads()),
|
||||
state_(TitleState::LOGO_ANIMATING) {
|
||||
state_(TitleState::LOGO_ANIMATING),
|
||||
num_controllers_(Input::get()->getNumGamepads()) {
|
||||
// Configura objetos
|
||||
tiled_bg_->setColor(param.title.bg_color);
|
||||
game_logo_->enable();
|
||||
|
||||
@@ -19,19 +19,11 @@ namespace Options {
|
||||
struct Gamepad;
|
||||
} // namespace Options
|
||||
|
||||
// Textos
|
||||
constexpr std::string_view TEXT_COPYRIGHT = "@2020,2025 JailDesigner";
|
||||
// --- Constantes ---
|
||||
constexpr std::string_view TEXT_COPYRIGHT = "@2020,2025 JailDesigner"; // Texto de copyright
|
||||
constexpr bool ALLOW_TITLE_ANIMATION_SKIP = false; // Permite saltar la animación del título
|
||||
|
||||
// Parámetros
|
||||
constexpr bool ALLOW_TITLE_ANIMATION_SKIP = false;
|
||||
|
||||
/*
|
||||
Clase que gestiona el estado de título/menú principal del juego.
|
||||
Responsable de mostrar el logo, el fondo animado y gestionar la entrada para comenzar la partida.
|
||||
No permite saltar la animación del título salvo que se cambie el define.
|
||||
*/
|
||||
|
||||
// Clase Title
|
||||
// --- Clase Title: gestiona el estado de título/menú principal del juego ---
|
||||
class Title {
|
||||
public:
|
||||
// --- Constructor y destructor ---
|
||||
@@ -42,17 +34,17 @@ class Title {
|
||||
void run();
|
||||
|
||||
private:
|
||||
// --- Enumeraciones ---
|
||||
// --- Enums ---
|
||||
enum class TitleState {
|
||||
LOGO_ANIMATING, // El logo está animándose
|
||||
LOGO_FINISHED, // El logo ha terminado de animarse
|
||||
START_HAS_BEEN_PRESSED, // Se ha pulsado el botón de start
|
||||
};
|
||||
|
||||
// --- Estructura para definir anclas ---
|
||||
// --- Estructuras privadas ---
|
||||
struct Anchor {
|
||||
int mini_logo;
|
||||
int copyright_text;
|
||||
int mini_logo; // Ancla del logo mini
|
||||
int copyright_text; // Ancla del texto de copyright
|
||||
};
|
||||
|
||||
// --- Objetos y punteros ---
|
||||
@@ -64,18 +56,16 @@ class Title {
|
||||
std::vector<std::shared_ptr<Player>> players_; // Vector de jugadores
|
||||
|
||||
// --- Variables de estado ---
|
||||
int counter_ = 0; // Temporizador para la pantalla de título
|
||||
Uint64 ticks_ = 0; // Contador de ticks para ajustar la velocidad
|
||||
Anchor anchor_; // Anclas para definir la posición de los elementos del título
|
||||
Section::Name next_section_; // Siguiente sección a cargar
|
||||
Section::Options selection_ = Section::Options::TITLE_TIME_OUT; // Opción elegida en el título
|
||||
int num_controllers_; // Número de mandos conectados
|
||||
TitleState state_; // Estado actual de la sección
|
||||
bool should_render_start_prompt_ = false; // Indica si se muestra o no el texto de PRESS START BUTTON TO PLAY
|
||||
bool player1_start_pressed_ = false; // Indica si se ha pulsdo el boton de empezar a jugar para el jugador 1
|
||||
bool player2_start_pressed_ = false; // Indica si se ha pulsdo el boton de empezar a jugar para el jugador 2
|
||||
|
||||
// -- Variables de diseño ---
|
||||
Anchor anchor_; // Anclas para definir la posición de los elementos del titulo
|
||||
Uint64 ticks_ = 0; // Contador de ticks para ajustar la velocidad
|
||||
int counter_ = 0; // Temporizador para la pantalla de título
|
||||
int num_controllers_; // Número de mandos conectados
|
||||
bool should_render_start_prompt_ = false; // Indica si se muestra el texto de PRESS START BUTTON TO PLAY
|
||||
bool player1_start_pressed_ = false; // Indica si se ha pulsado el botón de empezar para el jugador 1
|
||||
bool player2_start_pressed_ = false; // Indica si se ha pulsado el botón de empezar para el jugador 2
|
||||
|
||||
// --- Ciclo de vida del título ---
|
||||
void update(); // Actualiza las variables del objeto
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
// Utilidad multiplataforma para apagar el sistema de forma segura
|
||||
// --- Namespace SystemShutdown: utilidad multiplataforma para apagar el sistema de forma segura ---
|
||||
namespace SystemShutdown {
|
||||
|
||||
// Códigos de resultado para las operaciones de apagado
|
||||
enum class ShutdownResult {
|
||||
SUCCESS = 0,
|
||||
// --- Enums ---
|
||||
enum class ShutdownResult {
|
||||
SUCCESS = 0, // Éxito
|
||||
ERROR_PERMISSION, // Error de permisos insuficientes
|
||||
ERROR_SYSTEM_CALL, // Error en la llamada al sistema
|
||||
ERROR_FORK_FAILED, // Error al crear proceso hijo (Unix)
|
||||
ERROR_UNSUPPORTED // Sistema operativo no soportado
|
||||
};
|
||||
};
|
||||
|
||||
// Configuración para el apagado del sistema
|
||||
struct ShutdownConfig {
|
||||
int delay_seconds;
|
||||
bool force_close_apps;
|
||||
const char* shutdown_message;
|
||||
// --- Estructuras ---
|
||||
struct ShutdownConfig {
|
||||
int delay_seconds; // Segundos de retraso antes del apagado
|
||||
bool force_close_apps; // Forzar cierre de aplicaciones
|
||||
const char* shutdown_message; // Mensaje mostrado durante el apagado
|
||||
|
||||
// Constructor con valores por defecto
|
||||
ShutdownConfig()
|
||||
@@ -24,24 +24,14 @@ namespace SystemShutdown {
|
||||
, force_close_apps(true)
|
||||
, shutdown_message("El sistema se apagará...")
|
||||
{}
|
||||
};
|
||||
};
|
||||
|
||||
// Apaga el sistema con configuración por defecto
|
||||
ShutdownResult shutdownSystem();
|
||||
|
||||
// Apaga el sistema con configuración personalizada
|
||||
ShutdownResult shutdownSystem(const ShutdownConfig& config);
|
||||
|
||||
// Apaga el sistema con parámetros simples
|
||||
ShutdownResult shutdownSystem(int delay_seconds, bool force_apps = true);
|
||||
|
||||
// Convierte un código de resultado a string descriptivo
|
||||
const char* resultToString(ShutdownResult result);
|
||||
|
||||
// Verifica si el sistema actual soporta apagado programático
|
||||
bool isShutdownSupported();
|
||||
|
||||
// Obtiene información sobre los permisos necesarios en la plataforma actual
|
||||
const char* getRequiredPermissions();
|
||||
// --- Funciones ---
|
||||
ShutdownResult shutdownSystem(); // Apaga el sistema con configuración por defecto
|
||||
ShutdownResult shutdownSystem(const ShutdownConfig& config); // Apaga el sistema con configuración personalizada
|
||||
ShutdownResult shutdownSystem(int delay_seconds, bool force_apps = true); // Apaga el sistema con parámetros simples
|
||||
const char* resultToString(ShutdownResult result); // Convierte un código de resultado a string descriptivo
|
||||
bool isShutdownSupported(); // Verifica si el sistema actual soporta apagado programático
|
||||
const char* getRequiredPermissions(); // Obtiene información sobre los permisos necesarios
|
||||
|
||||
} // namespace SystemShutdown
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
class Texture;
|
||||
|
||||
// Clase SmartSprite: Sprite animado que se mueve hacia un destino y puede deshabilitarse automáticamente
|
||||
// --- Clase SmartSprite: sprite animado que se mueve hacia un destino y puede deshabilitarse automáticamente ---
|
||||
class SmartSprite : public AnimatedSprite {
|
||||
public:
|
||||
// --- Constructor y destructor ---
|
||||
@@ -31,11 +31,11 @@ class SmartSprite : public AnimatedSprite {
|
||||
void setEnabled(bool value) { enabled_ = value; } // Habilita o deshabilita el objeto
|
||||
|
||||
private:
|
||||
// --- Variables internas ---
|
||||
bool on_destination_ = false; // Indica si está en el destino
|
||||
// --- Variables de estado ---
|
||||
int dest_x_ = 0; // Posición de destino en el eje X
|
||||
int dest_y_ = 0; // Posición de destino en el eje Y
|
||||
int finished_counter_ = 0; // Contador para deshabilitarlo
|
||||
bool on_destination_ = false; // Indica si está en el destino
|
||||
bool finished_ = false; // Indica si ya ha terminado
|
||||
bool enabled_ = false; // Indica si el objeto está habilitado
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
class Texture;
|
||||
|
||||
// Clase Sprite: representa un objeto gráfico básico con posición, tamaño y textura
|
||||
// --- Clase Sprite: representa un objeto gráfico básico con posición, tamaño y textura ---
|
||||
class Sprite {
|
||||
public:
|
||||
// --- Constructores y destructor ---
|
||||
@@ -59,14 +59,13 @@ class Sprite {
|
||||
[[nodiscard]] auto getTextureCount() const -> size_t { return textures_.size(); } // Obtiene el número total de texturas
|
||||
|
||||
protected:
|
||||
auto getTextureRef() -> std::shared_ptr<Texture>& {
|
||||
return textures_.at(texture_index_);
|
||||
}
|
||||
// --- Métodos internos ---
|
||||
auto getTextureRef() -> std::shared_ptr<Texture>& { return textures_.at(texture_index_); } // Obtiene referencia a la textura activa
|
||||
|
||||
// --- Variables internas ---
|
||||
size_t texture_index_ = 0;
|
||||
std::vector<std::shared_ptr<Texture>> textures_; // Lista de texturas
|
||||
SDL_FRect pos_; // Posición y tamaño donde dibujar el sprite
|
||||
SDL_FRect sprite_clip_; // Rectángulo de origen de la textura que se dibujará en pantalla
|
||||
double zoom_ = 1.0F; // Zoom aplicado a la textura
|
||||
size_t texture_index_ = 0; // Índice de la textura activa
|
||||
};
|
||||
@@ -1,20 +1,24 @@
|
||||
#include "stage.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
// Implementación de StageData
|
||||
StageData::StageData(int power_to_complete, int min_menace, int max_menace, const std::string& name)
|
||||
: power_to_complete_(power_to_complete), min_menace_(min_menace),
|
||||
max_menace_(max_menace), name_(name), status_(StageStatus::LOCKED) {}
|
||||
: status_(StageStatus::LOCKED),
|
||||
name_(name),
|
||||
power_to_complete_(power_to_complete),
|
||||
min_menace_(min_menace),
|
||||
max_menace_(max_menace) {}
|
||||
|
||||
// Implementación de StageManager
|
||||
StageManager::StageManager()
|
||||
: current_power_(0), total_power_(0), current_stage_index_(0),
|
||||
: power_change_callback_(nullptr),
|
||||
power_collection_state_(PowerCollectionState::ENABLED),
|
||||
power_change_callback_(nullptr) {
|
||||
initialize();
|
||||
}
|
||||
current_stage_index_(0),
|
||||
current_power_(0),
|
||||
total_power_(0) { initialize(); }
|
||||
|
||||
void StageManager::initialize() {
|
||||
stages_.clear();
|
||||
|
||||
124
source/stage.h
124
source/stage.h
@@ -1,111 +1,111 @@
|
||||
#pragma once
|
||||
|
||||
#include "stage_interface.h"
|
||||
#include <vector>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <functional>
|
||||
#include <functional> // Para function
|
||||
#include <optional> // Para optional
|
||||
#include <string> // Para string
|
||||
#include <vector> // Para vector
|
||||
|
||||
// --- Estados posibles para la recolección de poder ---
|
||||
#include "stage_interface.h" // Para IStageInfo
|
||||
|
||||
// --- Enums ---
|
||||
enum class PowerCollectionState {
|
||||
ENABLED, // Recolección habilitada
|
||||
DISABLED // Recolección deshabilitada
|
||||
};
|
||||
|
||||
// --- Estados posibles para una fase del juego ---
|
||||
enum class StageStatus {
|
||||
LOCKED, // Fase bloqueada
|
||||
IN_PROGRESS, // Fase en progreso
|
||||
COMPLETED // Fase completada
|
||||
};
|
||||
|
||||
// --- Representa los datos de una fase del juego ---
|
||||
// --- Clase StageData: representa los datos de una fase del juego ---
|
||||
class StageData {
|
||||
private:
|
||||
public:
|
||||
// --- Constructor ---
|
||||
StageData(int power_to_complete, int min_menace, int max_menace, const std::string& name = ""); // Constructor de una fase
|
||||
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto getPowerToComplete() const -> int { return power_to_complete_; } // Obtiene el poder necesario para completar
|
||||
[[nodiscard]] auto getMinMenace() const -> int { return min_menace_; } // Obtiene el nivel mínimo de amenaza
|
||||
[[nodiscard]] auto getMaxMenace() const -> int { return max_menace_; } // Obtiene el nivel máximo de amenaza
|
||||
[[nodiscard]] auto getName() const -> const std::string& { return name_; } // Obtiene el nombre de la fase
|
||||
[[nodiscard]] auto getStatus() const -> StageStatus { return status_; } // Obtiene el estado actual
|
||||
[[nodiscard]] auto isCompleted() const -> bool { return status_ == StageStatus::COMPLETED; } // Verifica si está completada
|
||||
|
||||
// --- Setters ---
|
||||
void setStatus(StageStatus status) { status_ = status; } // Establece el estado de la fase
|
||||
|
||||
private:
|
||||
// --- Variables de estado ---
|
||||
StageStatus status_; // Estado actual de la fase
|
||||
std::string name_; // Nombre de la fase
|
||||
int power_to_complete_; // Poder necesario para completar la fase
|
||||
int min_menace_; // Nivel mínimo de amenaza
|
||||
int max_menace_; // Nivel máximo de amenaza
|
||||
std::string name_; // Nombre de la fase
|
||||
StageStatus status_; // Estado actual de la fase
|
||||
|
||||
public:
|
||||
// Constructor de una fase
|
||||
StageData(int power_to_complete, int min_menace, int max_menace, const std::string& name = "");
|
||||
|
||||
// --- Getters ---
|
||||
int getPowerToComplete() const { return power_to_complete_; }
|
||||
int getMinMenace() const { return min_menace_; }
|
||||
int getMaxMenace() const { return max_menace_; }
|
||||
const std::string& getName() const { return name_; }
|
||||
StageStatus getStatus() const { return status_; }
|
||||
|
||||
// --- Setters ---
|
||||
void setStatus(StageStatus status) { status_ = status; }
|
||||
|
||||
// --- Utilidades ---
|
||||
bool isCompleted() const { return status_ == StageStatus::COMPLETED; }
|
||||
};
|
||||
|
||||
// --- Gestor principal del sistema de fases del juego ---
|
||||
// --- Clase StageManager: gestor principal del sistema de fases del juego ---
|
||||
class StageManager : public IStageInfo {
|
||||
private:
|
||||
std::vector<StageData> stages_; // Lista de todas las fases
|
||||
int current_power_; // Poder actual en la fase activa
|
||||
int total_power_; // Poder total acumulado en todo el juego
|
||||
size_t current_stage_index_; // Índice de la fase actual
|
||||
PowerCollectionState power_collection_state_; // Estado de recolección de poder
|
||||
public:
|
||||
// --- Tipos ---
|
||||
using PowerChangeCallback = std::function<void(int)>; // Callback para cambios de poder
|
||||
|
||||
public:
|
||||
using PowerChangeCallback = std::function<void(int)>;
|
||||
|
||||
StageManager();
|
||||
// --- Constructor ---
|
||||
StageManager(); // Constructor principal
|
||||
|
||||
// --- Métodos principales del juego ---
|
||||
void initialize(); // Inicializa el gestor de fases
|
||||
void initialize(const std::string& stages_file); // Inicializa con archivo personalizado
|
||||
void reset(); // Reinicia el progreso del juego
|
||||
bool advanceToNextStage(); // Avanza a la siguiente fase
|
||||
auto advanceToNextStage() -> bool; // Avanza a la siguiente fase
|
||||
|
||||
// --- Gestión de poder ---
|
||||
bool subtractPower(int amount); // Resta poder de la fase actual
|
||||
auto subtractPower(int amount) -> bool; // Resta poder de la fase actual
|
||||
void enablePowerCollection(); // Habilita la recolección de poder
|
||||
void disablePowerCollection(); // Deshabilita la recolección de poder
|
||||
|
||||
// --- Navegación ---
|
||||
bool jumpToStage(size_t target_stage_index); // Salta a una fase específica
|
||||
auto jumpToStage(size_t target_stage_index) -> bool; // Salta a una fase específica
|
||||
|
||||
// --- Consultas de estado ---
|
||||
std::optional<StageData> getCurrentStage() const; // Obtiene la fase actual
|
||||
std::optional<StageData> getStage(size_t index) const; // Obtiene una fase específica
|
||||
size_t getCurrentStageIndex() const { return current_stage_index_; }
|
||||
int getCurrentPower() const { return current_power_; }
|
||||
int getTotalPower() const { return total_power_; }
|
||||
int getTotalPowerNeededToCompleteGame() const; // Poder total necesario para completar el juego
|
||||
size_t getTotalStages() const { return stages_.size(); }
|
||||
[[nodiscard]] auto getCurrentStage() const -> std::optional<StageData>; // Obtiene la fase actual
|
||||
[[nodiscard]] auto getStage(size_t index) const -> std::optional<StageData>; // Obtiene una fase específica
|
||||
[[nodiscard]] auto getCurrentStageIndex() const -> size_t { return current_stage_index_; } // Obtiene el índice de la fase actual
|
||||
[[nodiscard]] auto getCurrentPower() const -> int { return current_power_; } // Obtiene el poder actual
|
||||
[[nodiscard]] auto getTotalPower() const -> int { return total_power_; } // Obtiene el poder total acumulado
|
||||
[[nodiscard]] auto getTotalPowerNeededToCompleteGame() const -> int; // Poder total necesario para completar el juego
|
||||
[[nodiscard]] auto getTotalStages() const -> size_t { return stages_.size(); } // Obtiene el número total de fases
|
||||
|
||||
// --- Seguimiento de progreso ---
|
||||
bool isCurrentStageCompleted() const; // Verifica si la fase actual está completada
|
||||
bool isGameCompleted() const; // Verifica si el juego está completado
|
||||
double getProgressPercentage() const; // Progreso total del juego (0-100%)
|
||||
double getCurrentStageProgressPercentage() const; // Progreso de la fase actual (0-100%)
|
||||
double getCurrentStageProgressFraction() const; // Progreso de la fase actual (0.0-1.0)
|
||||
int getPowerNeededForCurrentStage() const; // Poder restante para completar la fase actual
|
||||
[[nodiscard]] auto isCurrentStageCompleted() const -> bool; // Verifica si la fase actual está completada
|
||||
[[nodiscard]] auto isGameCompleted() const -> bool; // Verifica si el juego está completado
|
||||
[[nodiscard]] auto getProgressPercentage() const -> double; // Progreso total del juego (0-100%)
|
||||
[[nodiscard]] auto getCurrentStageProgressPercentage() const -> double; // Progreso de la fase actual (0-100%)
|
||||
[[nodiscard]] auto getCurrentStageProgressFraction() const -> double; // Progreso de la fase actual (0.0-1.0)
|
||||
[[nodiscard]] auto getPowerNeededForCurrentStage() const -> int; // Poder restante para completar la fase actual
|
||||
|
||||
// --- Gestión de callbacks ---
|
||||
void setPowerChangeCallback(PowerChangeCallback callback); // Establece callback para cambios de poder
|
||||
void removePowerChangeCallback(); // Elimina callback de cambios de poder
|
||||
|
||||
// --- Implementación de la interfaz IStageInfo ---
|
||||
bool canCollectPower() const override;
|
||||
void addPower(int amount) override;
|
||||
int getCurrentMenaceLevel() const override;
|
||||
[[nodiscard]] auto canCollectPower() const -> bool override; // Verifica si se puede recolectar poder
|
||||
void addPower(int amount) override; // Añade poder a la fase actual
|
||||
[[nodiscard]] auto getCurrentMenaceLevel() const -> int override; // Obtiene el nivel de amenaza actual
|
||||
|
||||
private:
|
||||
private:
|
||||
// --- Variables de estado ---
|
||||
std::vector<StageData> stages_; // Lista de todas las fases
|
||||
PowerChangeCallback power_change_callback_; // Callback para notificar cambios de poder
|
||||
PowerCollectionState power_collection_state_; // Estado de recolección de poder
|
||||
size_t current_stage_index_; // Índice de la fase actual
|
||||
int current_power_; // Poder actual en la fase activa
|
||||
int total_power_; // Poder total acumulado en todo el juego
|
||||
|
||||
// --- Métodos privados ---
|
||||
// --- Métodos internos ---
|
||||
void createDefaultStages(); // Crea las fases predeterminadas del juego
|
||||
bool loadStagesFromFile(const std::string& filename); // Carga fases desde archivo
|
||||
bool validateStageIndex(size_t index) const; // Valida que un índice de fase sea válido
|
||||
auto loadStagesFromFile(const std::string& filename) -> bool; // Carga fases desde archivo
|
||||
[[nodiscard]] auto validateStageIndex(size_t index) const -> bool; // Valida que un índice de fase sea válido
|
||||
void updateStageStatuses(); // Actualiza los estados de todas las fases
|
||||
};
|
||||
@@ -2,58 +2,39 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
// Utilidades multiplataforma para operaciones del sistema
|
||||
// --- Namespace SystemUtils: utilidades multiplataforma para operaciones del sistema ---
|
||||
namespace SystemUtils {
|
||||
|
||||
// Códigos de resultado para operaciones del sistema
|
||||
enum class Result {
|
||||
// --- Enums ---
|
||||
enum class Result { // Códigos de resultado para operaciones del sistema
|
||||
SUCCESS = 0,
|
||||
PERMISSION_DENIED, // Sin permisos para crear la carpeta
|
||||
PATH_TOO_LONG, // Ruta demasiado larga
|
||||
ALREADY_EXISTS, // Ya existe (solo si se considera error)
|
||||
INVALID_PATH, // Ruta inválida
|
||||
UNKNOWN_ERROR // Error desconocido
|
||||
};
|
||||
};
|
||||
|
||||
// Configuración para creación de carpetas
|
||||
struct FolderConfig {
|
||||
// --- Estructuras ---
|
||||
struct FolderConfig { // Configuración para creación de carpetas
|
||||
bool create_parents; // Crear carpetas padre si no existen
|
||||
bool fail_if_exists; // Fallar si la carpeta ya existe
|
||||
int permissions; // Permisos Unix (ignorado en Windows)
|
||||
|
||||
// Constructor con valores por defecto
|
||||
FolderConfig()
|
||||
: create_parents(true)
|
||||
, fail_if_exists(false)
|
||||
, permissions(0755) // rwxr-xr-x
|
||||
: create_parents(true), fail_if_exists(false), permissions(0755) // rwxr-xr-x
|
||||
{}
|
||||
};
|
||||
};
|
||||
|
||||
// Crea la carpeta del sistema donde guardar datos de la aplicación
|
||||
Result createApplicationFolder(const std::string& app_name, std::string& out_path);
|
||||
|
||||
// Crea la carpeta del sistema con configuración personalizada
|
||||
Result createApplicationFolder(const std::string& app_name, std::string& out_path, const FolderConfig& config);
|
||||
|
||||
// Crea una carpeta en la ruta especificada
|
||||
Result createFolder(const std::string& path);
|
||||
|
||||
// Crea una carpeta con configuración personalizada
|
||||
Result createFolder(const std::string& path, const FolderConfig& config);
|
||||
|
||||
// Obtiene la ruta de datos de la aplicación (sin crearla)
|
||||
std::string getApplicationDataPath(const std::string& app_name);
|
||||
|
||||
// Verifica si una carpeta existe
|
||||
bool folderExists(const std::string& path);
|
||||
|
||||
// Convierte un código de resultado a string descriptivo
|
||||
const char* resultToString(Result result);
|
||||
|
||||
// Obtiene el directorio home del usuario
|
||||
std::string getHomeDirectory();
|
||||
|
||||
// Obtiene el directorio temporal del sistema
|
||||
std::string getTempDirectory();
|
||||
// --- Funciones ---
|
||||
Result createApplicationFolder(const std::string& app_name, std::string& out_path); // Crea la carpeta del sistema donde guardar datos de la aplicación
|
||||
Result createApplicationFolder(const std::string& app_name, std::string& out_path, const FolderConfig& config); // Crea la carpeta del sistema con configuración personalizada
|
||||
Result createFolder(const std::string& path); // Crea una carpeta en la ruta especificada
|
||||
Result createFolder(const std::string& path, const FolderConfig& config); // Crea una carpeta con configuración personalizada
|
||||
std::string getApplicationDataPath(const std::string& app_name); // Obtiene la ruta de datos de la aplicación (sin crearla)
|
||||
bool folderExists(const std::string& path); // Verifica si una carpeta existe
|
||||
const char* resultToString(Result result); // Convierte un código de resultado a string descriptivo
|
||||
std::string getHomeDirectory(); // Obtiene el directorio home del usuario
|
||||
std::string getTempDirectory(); // Obtiene el directorio temporal del sistema
|
||||
|
||||
} // namespace SystemUtils
|
||||
|
||||
@@ -78,16 +78,16 @@ class Text {
|
||||
// --- Configuración ---
|
||||
void setFixedWidth(bool value); // Establece si se usa un tamaño fijo de letra
|
||||
|
||||
// Llena una estructura Text::File desde un fichero
|
||||
static auto loadFile(const std::string &file_path) -> std::shared_ptr<Text::File>;
|
||||
// --- Métodos estáticos ---
|
||||
static auto loadFile(const std::string &file_path) -> std::shared_ptr<Text::File>; // Llena una estructura Text::File desde un fichero
|
||||
|
||||
private:
|
||||
// --- Objetos y punteros ---
|
||||
std::unique_ptr<Sprite> sprite_ = nullptr; // Objeto con los gráficos para el texto
|
||||
|
||||
// --- Variables ---
|
||||
// --- Variables de estado ---
|
||||
std::array<Offset, 128> offset_ = {}; // Vector con las posiciones y ancho de cada letra
|
||||
int box_width_ = 0; // Anchura de la caja de cada caracter en el png
|
||||
int box_height_ = 0; // Altura de la caja de cada caracter en el png
|
||||
bool fixed_width_ = false; // Indica si el texto se ha de escribir con longitud fija en todas las letras
|
||||
std::array<Offset, 128> offset_ = {}; // Vector con las posiciones y ancho de cada letra
|
||||
bool fixed_width_ = false; // Indica si el texto se ha de escribir con longitud fija
|
||||
};
|
||||
@@ -151,7 +151,7 @@ void Texture::setAlpha(Uint8 alpha) {
|
||||
}
|
||||
|
||||
// Renderiza la textura en un punto específico
|
||||
void Texture::render(int x, int y, SDL_FRect *clip, float zoom_w, float zoom_h, double angle, SDL_FPoint *center, SDL_FlipMode flip) {
|
||||
void Texture::render(int x, int y, SDL_FRect *clip, float horizontal_zoom, float vertical_zoom, double angle, SDL_FPoint *center, SDL_FlipMode flip) {
|
||||
// Establece el destino de renderizado en la pantalla
|
||||
SDL_FRect render_quad = {static_cast<float>(x), static_cast<float>(y), static_cast<float>(width_), static_cast<float>(height_)};
|
||||
|
||||
@@ -162,11 +162,11 @@ void Texture::render(int x, int y, SDL_FRect *clip, float zoom_w, float zoom_h,
|
||||
}
|
||||
|
||||
// Calcula el zoom y las coordenadas
|
||||
if (zoom_h != 1.0F || zoom_w != 1.0F) {
|
||||
if (vertical_zoom != 1.0F || horizontal_zoom != 1.0F) {
|
||||
render_quad.x = render_quad.x + (render_quad.w / 2);
|
||||
render_quad.y = render_quad.y + (render_quad.h / 2);
|
||||
render_quad.w = render_quad.w * zoom_w;
|
||||
render_quad.h = render_quad.h * zoom_h;
|
||||
render_quad.w = render_quad.w * horizontal_zoom;
|
||||
render_quad.h = render_quad.h * vertical_zoom;
|
||||
render_quad.x = render_quad.x - (render_quad.w / 2);
|
||||
render_quad.y = render_quad.y - (render_quad.h / 2);
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ class Texture {
|
||||
auto reLoad() -> bool; // Recarga la textura
|
||||
|
||||
// --- Renderizado ---
|
||||
void render(int x, int y, SDL_FRect *clip = nullptr, float zoom_w = 1, float zoom_h = 1, double angle = 0.0, SDL_FPoint *center = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE); // Renderiza la textura en un punto específico
|
||||
void render(int x, int y, SDL_FRect *clip = nullptr, float horizontal_zoom = 1, float vertical_zoom = 1, double angle = 0.0, SDL_FPoint *center = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE); // Renderiza la textura en un punto específico
|
||||
void setAsRenderTarget(SDL_Renderer *renderer); // Establece la textura como objetivo de renderizado
|
||||
|
||||
// --- Modificadores de color y blending ---
|
||||
|
||||
@@ -6,21 +6,17 @@
|
||||
|
||||
#include "color.h" // Para Color
|
||||
|
||||
// Modos de funcionamiento para el tileado de fondo
|
||||
enum class TiledBGMode : int {
|
||||
// --- Enums ---
|
||||
enum class TiledBGMode : int { // Modos de funcionamiento para el tileado de fondo
|
||||
CIRCLE = 0,
|
||||
DIAGONAL = 1,
|
||||
RANDOM = 2,
|
||||
STATIC = 3,
|
||||
};
|
||||
|
||||
/*
|
||||
Esta clase dibuja un tileado de fondo. Para ello se sirve de una textura "canvas", que rellena con los tiles.
|
||||
El rectángulo "window" recorre la textura de diferentes formas para generar el efecto de movimiento de la
|
||||
textura en pantalla.
|
||||
*/
|
||||
|
||||
// Clase TiledBG
|
||||
// --- Clase TiledBG: dibuja un tileado de fondo con efectos de movimiento ---
|
||||
// Esta clase se sirve de una textura "canvas", que rellena con los tiles.
|
||||
// El rectángulo "window" recorre la textura de diferentes formas para generar el efecto de movimiento.
|
||||
class TiledBG {
|
||||
public:
|
||||
// --- Constructores y destructor ---
|
||||
|
||||
@@ -11,21 +11,22 @@
|
||||
#include "text.h" // Para Text
|
||||
#include "ui/service_menu.h" // Para ServiceMenu
|
||||
|
||||
// --- Interfaz Base para todas las Opciones del Menú ---
|
||||
|
||||
// --- Clase MenuOption: interfaz base para todas las opciones del menú ---
|
||||
class MenuOption {
|
||||
public:
|
||||
// --- Enums ---
|
||||
enum class Behavior {
|
||||
ADJUST, // Solo puede ajustar valor (como IntOption, BoolOption, ListOption)
|
||||
SELECT, // Solo puede ejecutar acción (como ActionOption, FolderOption)
|
||||
BOTH // Puede tanto ajustar como ejecutar acción (como ActionListOption)
|
||||
};
|
||||
|
||||
// --- Constructor y destructor ---
|
||||
MenuOption(std::string caption, ServiceMenu::SettingsGroup group, bool hidden = false)
|
||||
: caption_(std::move(caption)), group_(group), hidden_(hidden) {}
|
||||
|
||||
virtual ~MenuOption() = default;
|
||||
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto getCaption() const -> const std::string & { return caption_; }
|
||||
[[nodiscard]] auto getGroup() const -> ServiceMenu::SettingsGroup { return group_; }
|
||||
[[nodiscard]] auto isHidden() const -> bool { return hidden_; }
|
||||
@@ -37,10 +38,10 @@ class MenuOption {
|
||||
[[nodiscard]] virtual auto getTargetGroup() const -> ServiceMenu::SettingsGroup { return ServiceMenu::SettingsGroup::MAIN; }
|
||||
virtual void executeAction() {}
|
||||
|
||||
// Método virtual para que cada opción calcule el ancho de su valor más largo.
|
||||
virtual auto getMaxValueWidth(Text *text_renderer) const -> int { return 0; }
|
||||
virtual auto getMaxValueWidth(Text *text_renderer) const -> int { return 0; } // Método virtual para que cada opción calcule el ancho de su valor más largo
|
||||
|
||||
protected:
|
||||
// --- Variables ---
|
||||
std::string caption_;
|
||||
ServiceMenu::SettingsGroup group_;
|
||||
bool hidden_;
|
||||
|
||||
@@ -16,13 +16,13 @@ class Texture;
|
||||
// --- Clase Notifier: gestiona las notificaciones en pantalla (singleton) ---
|
||||
class Notifier {
|
||||
public:
|
||||
// Posiciones de las notificaciones
|
||||
// --- Enums ---
|
||||
enum class Position {
|
||||
TOP,
|
||||
BOTTOM,
|
||||
LEFT,
|
||||
MIDDLE,
|
||||
RIGHT,
|
||||
TOP, // Parte superior
|
||||
BOTTOM, // Parte inferior
|
||||
LEFT, // Lado izquierdo
|
||||
MIDDLE, // Centro
|
||||
RIGHT, // Lado derecho
|
||||
};
|
||||
|
||||
// --- Métodos de singleton ---
|
||||
@@ -41,31 +41,31 @@ class Notifier {
|
||||
auto checkCode(const std::string &code) -> bool { return stringInVector(getCodes(), code); } // Comprueba si hay alguna notificación con un código concreto
|
||||
|
||||
private:
|
||||
// --- Tipos internos ---
|
||||
// --- Enums privados ---
|
||||
enum class State {
|
||||
RISING,
|
||||
STAY,
|
||||
VANISHING,
|
||||
FINISHED,
|
||||
RISING, // Apareciendo
|
||||
STAY, // Visible
|
||||
VANISHING, // Desapareciendo
|
||||
FINISHED, // Terminada
|
||||
};
|
||||
|
||||
enum class Shape {
|
||||
ROUNDED,
|
||||
SQUARED,
|
||||
ROUNDED, // Forma redondeada
|
||||
SQUARED, // Forma cuadrada
|
||||
};
|
||||
|
||||
// --- Estructura Notification ---
|
||||
// --- Estructuras privadas ---
|
||||
struct Notification {
|
||||
std::shared_ptr<Texture> texture; // Textura de la notificación
|
||||
std::shared_ptr<Sprite> sprite; // Sprite asociado
|
||||
std::vector<std::string> texts; // Textos a mostrar
|
||||
int counter{0}; // Contador de tiempo
|
||||
SDL_FRect rect; // Rectángulo de la notificación
|
||||
std::string code; // Código identificador de la notificación
|
||||
State state{State::RISING}; // Estado de la notificación
|
||||
Shape shape{Shape::SQUARED}; // Forma de la notificación
|
||||
SDL_FRect rect; // Rectángulo de la notificación
|
||||
int counter{0}; // Contador de tiempo
|
||||
int y{0}; // Posición vertical
|
||||
int travel_dist{0}; // Distancia a recorrer
|
||||
std::string code; // Código identificador de la notificación
|
||||
|
||||
// Constructor
|
||||
explicit Notification()
|
||||
@@ -78,9 +78,9 @@ class Notifier {
|
||||
std::shared_ptr<Text> text_; // Objeto para dibujar texto
|
||||
|
||||
// --- Variables de estado ---
|
||||
std::vector<Notification> notifications_; // Lista de notificaciones activas
|
||||
Color bg_color_; // Color de fondo de las notificaciones
|
||||
int wait_time_; // Tiempo que se ve la notificación
|
||||
std::vector<Notification> notifications_; // Lista de notificaciones activas
|
||||
bool stack_; // Indica si las notificaciones se apilan
|
||||
bool has_icons_; // Indica si el notificador tiene textura para iconos
|
||||
|
||||
@@ -97,10 +97,10 @@ class Notifier {
|
||||
static void moveNotificationVertically(Notification ¬ification, int direction); // Mueve verticalmente una notificación en una dirección dada (útil para animación en apilamiento)
|
||||
void transitionToStayState(int index); // Cambia el estado de una notificación de RISING a STAY cuando ha alcanzado su posición final
|
||||
|
||||
// --- Constructor y destructor ---
|
||||
// --- Constructores y destructor privados (singleton) ---
|
||||
Notifier(std::string icon_file, std::shared_ptr<Text> text); // Constructor privado
|
||||
~Notifier() = default; // Destructor privado
|
||||
|
||||
// --- Singleton ---
|
||||
static Notifier *instance;
|
||||
// --- Instancia singleton ---
|
||||
static Notifier *instance; // Instancia única de Notifier
|
||||
};
|
||||
@@ -12,24 +12,21 @@
|
||||
constexpr int BLOCK = 8;
|
||||
constexpr int TOTAL_DEMO_DATA = 2000;
|
||||
|
||||
// --- Estructuras y tipos ---
|
||||
// --- Estructuras ---
|
||||
struct Overrides {
|
||||
std::string param_file; // Fichero de parametros a utilizar
|
||||
bool clear_hi_score_table{false}; // Reinicia la tabla de records
|
||||
|
||||
Overrides() = default;
|
||||
};
|
||||
extern Overrides overrides;
|
||||
|
||||
// Estructura para definir un circulo
|
||||
struct Circle {
|
||||
int x, y, r;
|
||||
int x, y, r; // Coordenadas y radio
|
||||
Circle() : x(0), y(0), r(0) {}
|
||||
Circle(int x_coord, int y_coord, int radius)
|
||||
: x(x_coord), y(y_coord), r(radius) {}
|
||||
};
|
||||
|
||||
// Estructura para datos de la demo
|
||||
struct DemoKeys {
|
||||
Uint8 left;
|
||||
Uint8 right;
|
||||
@@ -42,6 +39,7 @@ struct DemoKeys {
|
||||
: left(l), right(r), no_input(ni), fire(f), fire_left(fl), fire_right(fr) {}
|
||||
};
|
||||
|
||||
// --- Tipos ---
|
||||
using DemoData = std::vector<DemoKeys>;
|
||||
|
||||
struct Demo {
|
||||
@@ -56,7 +54,6 @@ struct Demo {
|
||||
: enabled(e), recording(r), counter(c), keys(k), data(d) {}
|
||||
};
|
||||
|
||||
// Posiciones dentro de un rectangulo
|
||||
struct Zone {
|
||||
SDL_FRect rect; // Rectangulo que define la zona
|
||||
float center_x; // Anclaje al 50% del eje X
|
||||
@@ -67,7 +64,10 @@ struct Zone {
|
||||
float third_quarter_y; // Anclaje al 75% del eje Y
|
||||
};
|
||||
|
||||
// --- Funciones utilitarias ---
|
||||
// --- Variables ---
|
||||
extern Overrides overrides; // Configuración global de overrides
|
||||
|
||||
// --- Funciones ---
|
||||
|
||||
// Colisiones y geometría
|
||||
auto distanceSquared(int x1, int y1, int x2, int y2) -> double;
|
||||
|
||||
@@ -6,23 +6,19 @@
|
||||
|
||||
class Text;
|
||||
|
||||
// Clase Writer. Pinta texto en pantalla letra a letra a partir de una cadena y un objeto Text
|
||||
// --- Clase Writer: pinta texto en pantalla letra a letra ---
|
||||
class Writer {
|
||||
public:
|
||||
// Constructor
|
||||
// --- Constructor y destructor ---
|
||||
explicit Writer(std::shared_ptr<Text> text)
|
||||
: text_(std::move(text)) {}
|
||||
|
||||
// Destructor
|
||||
~Writer() = default;
|
||||
|
||||
// Actualiza el objeto
|
||||
void update();
|
||||
// --- Métodos principales ---
|
||||
void update(); // Actualiza el objeto
|
||||
void render() const; // Dibuja el objeto en pantalla
|
||||
|
||||
// Dibuja el objeto en pantalla
|
||||
void render() const;
|
||||
|
||||
// Setters
|
||||
// --- Setters ---
|
||||
void setPosX(int value); // Establece la posición X
|
||||
void setPosY(int value); // Establece la posición Y
|
||||
void setKerning(int value); // Establece el kerning (espaciado entre caracteres)
|
||||
@@ -31,10 +27,9 @@ class Writer {
|
||||
void setEnabled(bool value); // Habilita o deshabilita el objeto
|
||||
void setFinishedCounter(int time); // Establece el temporizador para deshabilitar el objeto
|
||||
|
||||
// Centra la cadena de texto a un punto X
|
||||
void center(int x);
|
||||
void center(int x); // Centra la cadena de texto a un punto X
|
||||
|
||||
// Getters
|
||||
// --- Getters ---
|
||||
[[nodiscard]] auto isEnabled() const -> bool; // Indica si el objeto está habilitado
|
||||
[[nodiscard]] auto hasFinished() const -> bool; // Indica si ya ha terminado
|
||||
|
||||
@@ -43,16 +38,16 @@ class Writer {
|
||||
std::shared_ptr<Text> text_; // Objeto encargado de escribir el texto
|
||||
|
||||
// --- Variables de estado ---
|
||||
std::string caption_; // El texto para escribir
|
||||
int pos_x_ = 0; // Posición en el eje X donde empezar a escribir el texto
|
||||
int pos_y_ = 0; // Posición en el eje Y donde empezar a escribir el texto
|
||||
int kerning_ = 0; // Kerning del texto, es decir, espaciado entre caracteres
|
||||
std::string caption_; // El texto para escribir
|
||||
int speed_ = 0; // Velocidad de escritura
|
||||
int writing_counter_ = 0; // Temporizador de escritura para cada caracter
|
||||
int index_ = 0; // Posición del texto que se está escribiendo
|
||||
int lenght_ = 0; // Longitud de la cadena a escribir
|
||||
int enabled_counter_ = 0; // Temporizador para deshabilitar el objeto
|
||||
bool completed_ = false; // Indica si se ha escrito todo el texto
|
||||
bool enabled_ = false; // Indica si el objeto está habilitado
|
||||
int enabled_counter_ = 0; // Temporizador para deshabilitar el objeto
|
||||
bool finished_ = false; // Indica si ya ha terminado
|
||||
};
|
||||
Reference in New Issue
Block a user