#pragma once #include #include // for uint8_t #include // for vector class Sprite; class Text; class Texture; struct Section; // Clase Instructions class Instructions { public: enum class Mode : std::uint8_t { MANUAL, AUTO }; Instructions(SDL_Renderer *renderer, Section *section); // Constructor ~Instructions(); // Destructor Instructions(const Instructions &) = delete; auto operator=(const Instructions &) -> Instructions & = delete; void run(Mode mode); // Bucle principal void start(Mode mode); // Inicia las instrucciones (sin bucle) void update(); // Actualiza las variables (frame-based) void update(float dt_s); // Actualiza las variables (time-based) void render(); // Pinta en pantalla void checkEvents(); // Comprueba los eventos [[nodiscard]] auto hasFinished() const -> bool; // Indica si las instrucciones han terminado [[nodiscard]] auto isQuitRequested() const -> bool; // Indica si se ha solicitado salir de la aplicación private: // Objetos y punteros SDL_Renderer *renderer_; // El renderizador de la ventana std::vector item_textures_; // Vector con las texturas de los items SDL_Event *event_handler_; // Manejador de eventos SDL_Texture *backbuffer_; // Textura para usar como backbuffer Sprite *sprite_; // Sprite con la textura de las instrucciones Text *text_; // Objeto para escribir texto Section *section_; // Estado del bucle principal para saber si continua o se sale // Variables Uint16 counter_; // Contador (derivat de elapsed_s_ * 60 en mode time-based) Uint16 counter_end_; // Valor final para el contador Uint32 ticks_; // Contador de ticks para ajustar la velocidad del programa (frame-based) Uint32 ticks_speed_; // Velocidad a la que se repiten los bucles del programa (frame-based) float elapsed_s_{0.0F}; // Acumulador de temps (time-based) bool manual_quit_; // Indica si se quiere salir del modo manual Mode mode_{Instructions::Mode::AUTO}; // Modo en el que se van a ejecutar las instrucciones bool finished_; // Indica si las instrucciones han terminado bool quit_requested_; // Indica si se ha solicitado salir de la aplicación // Time-based: durada total de la escena en mode AUTO (600 frames a 60Hz). static constexpr float SCENE_DURATION_S = 10.0F; // Time-based: temps mínim al mode MANUAL abans de poder sortir (30 frames a 60Hz). static constexpr float MANUAL_QUIT_DELAY_S = 0.5F; void checkInput(); // Comprueba las entradas };