#pragma once #include // for SDL_Renderer #include // for unique_ptr, shared_ptr #include "defines.h" // for AppMode class Texture; class Sprite; // Estados de la máquina de estados del logo enum class AppLogoState { HIDDEN, // Logo oculto, esperando APPLOGO_DISPLAY_INTERVAL FADE_IN, // Apareciendo (alpha 0 → 255) VISIBLE, // Completamente visible, esperando APPLOGO_DISPLAY_DURATION FADE_OUT // Desapareciendo (alpha 255 → 0) }; // Tipo de animación de entrada/salida enum class AppLogoAnimationType { ZOOM_ONLY, // Solo zoom simple (120% → 100% → 120%) ELASTIC_STICK // Zoom + deformación elástica tipo "pegatina" }; class AppLogo { public: AppLogo() = default; ~AppLogo() = default; // Inicializar textura y sprite del logo bool initialize(SDL_Renderer* renderer, int screen_width, int screen_height); // Actualizar temporizadores y estado de visibilidad void update(float delta_time, AppMode current_mode); // Renderizar logo si está visible void render(); // Actualizar tamaño de pantalla (reposicionar logo) void updateScreenSize(int screen_width, int screen_height); private: std::shared_ptr logo_texture_; // Textura del logo std::unique_ptr logo_sprite_; // Sprite para renderizar AppLogoState state_ = AppLogoState::HIDDEN; // Estado actual de la máquina de estados float timer_ = 0.0f; // Contador de tiempo para estado actual int current_alpha_ = 0; // Alpha actual (0-255) float current_scale_ = 1.0f; // Escala actual (1.0 = 100%) // Tipo de animación (FIJO para testing: ELASTIC_STICK) AppLogoAnimationType animation_type_ = AppLogoAnimationType::ELASTIC_STICK; // Variables de deformación elástica (para ELASTIC_STICK) float squash_y_ = 1.0f; // Factor de aplastamiento vertical (1.0 = normal) float stretch_x_ = 1.0f; // Factor de estiramiento horizontal (1.0 = normal) float rotation_ = 0.0f; // Rotación en radianes (para efecto despegar) int screen_width_ = 0; // Ancho de pantalla (para centrar) int screen_height_ = 0; // Alto de pantalla (para centrar) // Tamaño base del logo (calculado una vez) float base_width_ = 0.0f; float base_height_ = 0.0f; // SDL renderer (necesario para renderizado con geometría) SDL_Renderer* renderer_ = nullptr; // Métodos privados auxiliares void updateLogoPosition(); // Centrar logo en pantalla void renderWithGeometry(); // Renderizar con vértices deformados // Funciones de easing float easeOutElastic(float t); // Elastic bounce out float easeOutBack(float t); // Overshoot out };