#pragma once #include // Para SDL_Event, SDL_GamepadButtonEvent #include // Para SDL_GamepadButton #include // Para std::shared_ptr #include // Para size_t #include // Para std::string #include // Para std::vector // Declaraciones adelantadas class Input; class Text; enum class InputAction : int; // Estructura para definir botones struct DefineButtonsButton { std::string label; // Texto en pantalla InputAction input; // Acción asociada SDL_GamepadButton button; // Botón del mando DefineButtonsButton(const std::string &lbl, InputAction inp, SDL_GamepadButton btn) : label(lbl), input(inp), button(btn) {} }; // Clase DefineButtons class DefineButtons { public: DefineButtons(); ~DefineButtons() = default; void render(); // Dibuja el objeto en pantalla void checkEvents(const SDL_Event &event); // Procesa los eventos bool enable(int index_controller); // Habilita la redefinición de botones bool isEnabled() const; // Comprueba si está habilitado private: // Objetos Input *input_ = nullptr; // Gestión de entrada std::shared_ptr text_; // Renderizado de texto // Variables bool enabled_ = false; // Indica si está activo int x_ = 0, y_ = 0; // Coordenadas de texto std::vector buttons_; // Definiciones de botones size_t index_controller_ = 0; // Índice del controlador asignado size_t index_button_ = 0; // Índice del botón en proceso std::vector controller_names_; // Nombres de los mandos bool finished_ = false; // Métodos internos void incIndexButton(); // Incrementa el índice de botones void doControllerButtonDown(const SDL_GamepadButtonEvent &event); // Procesa pulsaciones void bindButtons(); // Asigna botones al sistema de entrada void saveBindingsToOptions(); // Guarda configuraciones bool checkButtonNotInUse(SDL_GamepadButton button); // Verifica uso de botones void clearButtons(); // Limpia asignaciones actuales void checkEnd(); // Comprueba si ha finalizado };