feat: Sistema dual de logos con animaciones independientes + ajuste de tamaño/posición

Implementación de sistema de 2 logos superpuestos con animaciones completamente independientes:

**Nuevas características:**
- Dos logos superpuestos (logo1.png + logo2.png) con animaciones independientes
- 4 tipos de animación: ZOOM_ONLY, ELASTIC_STICK, ROTATE_SPIRAL, BOUNCE_SQUASH
- Aleatorización independiente para entrada y salida de cada logo
- 256 combinaciones posibles (4×4 entrada × 4×4 salida)

**Ajuste de tamaño y posición:**
- Nueva constante APPLOGO_HEIGHT_PERCENT (40%) - altura del logo respecto a pantalla
- Nueva constante APPLOGO_PADDING_PERCENT (10%) - padding desde esquina inferior-derecha
- Logo anclado a esquina en lugar de centrado en cuadrante
- Valores fácilmente ajustables mediante constantes en defines.h

**Cambios técnicos:**
- Variables duplicadas para logo1 y logo2 (scale, squash, stretch, rotation)
- Variables compartidas para sincronización (state, timer, alpha)
- renderWithGeometry() acepta parámetro logo_index (1 o 2)
- Logo1 renderizado primero (fondo), Logo2 encima (overlay)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-18 10:01:32 +02:00
parent 8d608357b4
commit c91cb1ca56
5 changed files with 454 additions and 152 deletions

View File

@@ -19,8 +19,10 @@ enum class AppLogoState {
// 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"
ZOOM_ONLY, // A: Solo zoom simple (120% → 100% → 120%)
ELASTIC_STICK, // B: Zoom + deformación elástica tipo "pegatina"
ROTATE_SPIRAL, // C: Rotación en espiral (entra girando, sale girando)
BOUNCE_SQUASH // D: Rebote con aplastamiento (cae rebotando, salta)
};
class AppLogo {
@@ -41,21 +43,34 @@ class AppLogo {
void updateScreenSize(int screen_width, int screen_height);
private:
std::shared_ptr<Texture> logo_texture_; // Textura del logo
std::unique_ptr<Sprite> logo_sprite_; // Sprite para renderizar
// Texturas y sprites (x2 - logo1 y logo2 superpuestos)
std::shared_ptr<Texture> logo1_texture_; // Textura del logo1 (data/logo/logo.png)
std::unique_ptr<Sprite> logo1_sprite_; // Sprite para renderizar logo1
std::shared_ptr<Texture> logo2_texture_; // Textura del logo2 (data/logo/logo2.png)
std::unique_ptr<Sprite> logo2_sprite_; // Sprite para renderizar logo2
// Variables COMPARTIDAS (sincronización de ambos logos)
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;
// Animaciones INDEPENDIENTES para cada logo
AppLogoAnimationType logo1_entry_animation_ = AppLogoAnimationType::ZOOM_ONLY;
AppLogoAnimationType logo1_exit_animation_ = AppLogoAnimationType::ZOOM_ONLY;
AppLogoAnimationType logo2_entry_animation_ = AppLogoAnimationType::ZOOM_ONLY;
AppLogoAnimationType logo2_exit_animation_ = AppLogoAnimationType::ZOOM_ONLY;
// 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)
// Variables de deformación INDEPENDIENTES para logo1
float logo1_scale_ = 1.0f; // Escala actual de logo1 (1.0 = 100%)
float logo1_squash_y_ = 1.0f; // Factor de aplastamiento vertical logo1
float logo1_stretch_x_ = 1.0f; // Factor de estiramiento horizontal logo1
float logo1_rotation_ = 0.0f; // Rotación en radianes logo1
// Variables de deformación INDEPENDIENTES para logo2
float logo2_scale_ = 1.0f; // Escala actual de logo2 (1.0 = 100%)
float logo2_squash_y_ = 1.0f; // Factor de aplastamiento vertical logo2
float logo2_stretch_x_ = 1.0f; // Factor de estiramiento horizontal logo2
float logo2_rotation_ = 0.0f; // Rotación en radianes logo2
int screen_width_ = 0; // Ancho de pantalla (para centrar)
int screen_height_ = 0; // Alto de pantalla (para centrar)
@@ -68,10 +83,15 @@ class AppLogo {
SDL_Renderer* renderer_ = nullptr;
// Métodos privados auxiliares
void updateLogoPosition(); // Centrar logo en pantalla
void renderWithGeometry(); // Renderizar con vértices deformados
void updateLogoPosition(); // Centrar ambos logos en pantalla (superpuestos)
void renderWithGeometry(int logo_index); // Renderizar logo con vértices deformados (1 o 2)
// Funciones de easing
float easeOutElastic(float t); // Elastic bounce out
float easeOutBack(float t); // Overshoot out
float easeOutBounce(float t); // Bounce easing (para BOUNCE_SQUASH)
float easeInOutQuad(float t); // Quadratic easing (para ROTATE_SPIRAL)
// Función auxiliar para elegir animación aleatoria
AppLogoAnimationType getRandomAnimation();
};