From 4f926ddebf73c0e8fe1895b5c9a753517d6c9eb4 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 28 Nov 2025 22:43:36 +0100 Subject: [PATCH] el zoom del LOGO ja es correcte --- data/shapes/letra_a.shp | 3 +- data/shapes/letra_e.shp | 2 +- data/shapes/letra_g.shp | 2 +- data/shapes/letra_j.shp | 2 +- data/shapes/letra_l.shp | 2 +- data/shapes/letra_m.shp | 2 +- data/shapes/letra_s.shp | 2 +- sample.png | Bin 0 -> 37413 bytes source/game/escenes/escena_logo.cpp | 101 ++++++++++++++++++++-------- source/game/escenes/escena_logo.hpp | 12 ++-- 10 files changed, 87 insertions(+), 41 deletions(-) create mode 100644 sample.png diff --git a/data/shapes/letra_a.shp b/data/shapes/letra_a.shp index 2f6c379..1fd343e 100644 --- a/data/shapes/letra_a.shp +++ b/data/shapes/letra_a.shp @@ -6,4 +6,5 @@ name: letra_a scale: 1.0 center: 35.71, 50.00 -polyline: 28.57,71.43 28.57,100.00 0.00,100.00 0.00,14.29 14.29,14.29 14.29,0.00 57.14,0.00 57.14,14.29 71.43,14.29 71.43,100.00 42.86,100.00 42.86,71.43 28.57,14.29 28.57,57.14 42.86,57.14 42.86,14.29 +polyline: 28.57,71.43 28.57,100.00 0.00,100.00 0.00,14.29 14.29,14.29 14.29,0.00 57.14,0.00 57.14,14.29 71.43,14.29 71.43,100.00 42.86,100.00 42.86,71.43 28.57,71.43 +polyline: 28.57,14.29 28.57,57.14 42.86,57.14 42.86,14.29 28.57,14.29 diff --git a/data/shapes/letra_e.shp b/data/shapes/letra_e.shp index d0fd9f6..690b251 100644 --- a/data/shapes/letra_e.shp +++ b/data/shapes/letra_e.shp @@ -6,4 +6,4 @@ name: letra_e scale: 1.0 center: 35.71, 50.00 -polyline: 57.14,28.57 57.14,42.86 28.57,42.86 28.57,85.71 71.43,85.71 71.43,100.00 0.00,100.00 0.00,0.00 71.43,0.00 71.43,14.29 28.57,14.29 28.57,28.57 +polyline: 57.14,28.57 57.14,42.86 28.57,42.86 28.57,85.71 71.43,85.71 71.43,100.00 0.00,100.00 0.00,0.00 71.43,0.00 71.43,14.29 28.57,14.29 28.57,28.57 57.14,28.57 diff --git a/data/shapes/letra_g.shp b/data/shapes/letra_g.shp index c3940eb..da12b1b 100644 --- a/data/shapes/letra_g.shp +++ b/data/shapes/letra_g.shp @@ -6,4 +6,4 @@ name: letra_g scale: 1.0 center: 35.71, 50.00 -polyline: 14.29,0.00 57.14,0.00 57.14,14.29 28.57,14.29 28.57,85.71 42.86,85.71 42.86,42.86 71.43,42.86 71.43,100.00 14.29,100.00 14.29,85.71 0.00,85.71 0.00,14.29 14.29,14.29 +polyline: 14.29,0.00 57.14,0.00 57.14,14.29 28.57,14.29 28.57,85.71 42.86,85.71 42.86,42.86 71.43,42.86 71.43,100.00 14.29,100.00 14.29,85.71 0.00,85.71 0.00,14.29 14.29,14.29 14.29,0.00 diff --git a/data/shapes/letra_j.shp b/data/shapes/letra_j.shp index 1e81cf8..767e500 100644 --- a/data/shapes/letra_j.shp +++ b/data/shapes/letra_j.shp @@ -6,4 +6,4 @@ name: letra_j scale: 1.0 center: 28.57, 50.00 -polyline: 0.00,100.00 0.00,85.71 28.57,85.71 28.57,0.00 57.14,0.00 57.14,85.71 42.86,85.71 42.86,100.00 +polyline: 0.00,100.00 0.00,85.71 28.57,85.71 28.57,0.00 57.14,0.00 57.14,85.71 42.86,85.71 42.86,100.00 0.00,100.00 diff --git a/data/shapes/letra_l.shp b/data/shapes/letra_l.shp index ab0a35c..ec69402 100644 --- a/data/shapes/letra_l.shp +++ b/data/shapes/letra_l.shp @@ -6,4 +6,4 @@ name: letra_l scale: 1.0 center: 28.57, 50.00 -polyline: 0.00,0.00 28.57,0.00 28.57,85.71 57.14,85.71 57.14,100.00 0.00,100.00 +polyline: 0.00,0.00 28.57,0.00 28.57,85.71 57.14,85.71 57.14,100.00 0.00,100.00 0.00,0.00 diff --git a/data/shapes/letra_m.shp b/data/shapes/letra_m.shp index 93ff5c3..c8e88bd 100644 --- a/data/shapes/letra_m.shp +++ b/data/shapes/letra_m.shp @@ -6,4 +6,4 @@ name: letra_m scale: 1.0 center: 50.00, 50.00 -polyline: 71.43,57.14 57.14,57.14 57.14,71.43 42.86,71.43 42.86,57.14 28.57,57.14 28.57,100.00 0.00,100.00 0.00,0.00 14.29,0.00 14.29,14.29 28.57,14.29 28.57,28.57 42.86,28.57 42.86,42.86 57.14,42.86 57.14,28.57 71.43,28.57 71.43,14.29 85.71,14.29 85.71,0.00 100.00,0.00 100.00,100.00 71.43,100.00 +polyline: 71.43,57.14 57.14,57.14 57.14,71.43 42.86,71.43 42.86,57.14 28.57,57.14 28.57,100.00 0.00,100.00 0.00,0.00 14.29,0.00 14.29,14.29 28.57,14.29 28.57,28.57 42.86,28.57 42.86,42.86 57.14,42.86 57.14,28.57 71.43,28.57 71.43,14.29 85.71,14.29 85.71,0.00 100.00,0.00 100.00,100.00 71.43,100.00 71.43,57.14 diff --git a/data/shapes/letra_s.shp b/data/shapes/letra_s.shp index e210945..5cd6b76 100644 --- a/data/shapes/letra_s.shp +++ b/data/shapes/letra_s.shp @@ -6,4 +6,4 @@ name: letra_s scale: 1.0 center: 28.57, 50.00 -polyline: 0.00,85.71 28.57,85.71 28.57,57.14 14.29,57.14 14.29,42.86 0.00,42.86 0.00,14.29 14.29,14.29 14.29,0.00 57.14,0.00 57.14,14.29 28.57,14.29 28.57,42.86 42.86,42.86 42.86,57.14 57.14,57.14 57.14,85.71 42.86,85.71 42.86,100.00 0.00,100.00 +polyline: 0.00,85.71 28.57,85.71 28.57,57.14 14.29,57.14 14.29,42.86 0.00,42.86 0.00,14.29 14.29,14.29 14.29,0.00 57.14,0.00 57.14,14.29 28.57,14.29 28.57,42.86 42.86,42.86 42.86,57.14 57.14,57.14 57.14,85.71 42.86,85.71 42.86,100.00 0.00,100.00 0.00,85.71 diff --git a/sample.png b/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..8c394a2c03f32578da5959e681bea5b70833f629 GIT binary patch literal 37413 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 SYz;(!*Wvx<`?B{s{rDe>^*vPp literal 0 HcmV?d00001 diff --git a/source/game/escenes/escena_logo.cpp b/source/game/escenes/escena_logo.cpp index 5c22b1c..8ef295f 100644 --- a/source/game/escenes/escena_logo.cpp +++ b/source/game/escenes/escena_logo.cpp @@ -10,6 +10,32 @@ #include #include +// Helper: calcular el progrés individual d'una lletra +// en funció del progrés global (efecte seqüencial) +static float calcular_progress_letra(size_t letra_index, + size_t num_letras, + float global_progress) { + if (num_letras == 0) + return 1.0f; + + constexpr float THRESHOLD = 0.5f; // Següent comença al 50% + + // Calcular temps per lletra + float duration_per_letra = 1.0f / static_cast(num_letras); + float step = THRESHOLD * duration_per_letra; + float start = static_cast(letra_index) * step; + float end = start + duration_per_letra; + + // Interpolar progrés + if (global_progress < start) { + return 0.0f; // Encara no ha començat + } else if (global_progress >= end) { + return 1.0f; // Completament apareguda + } else { + return (global_progress - start) / (end - start); + } +} + EscenaLogo::EscenaLogo(SDLManager& sdl) : sdl_(sdl), temps_acumulat_(0.0f) { std::cout << "Escena Logo: Inicialitzant...\n"; @@ -90,12 +116,18 @@ void EscenaLogo::inicialitzar_lletres() { } } - float ancho = max_x - min_x; + float ancho_sin_escalar = max_x - min_x; + + // IMPORTANT: Escalar ancho i offset amb ESCALA_FINAL + // per que les posicions finals coincideixin amb la mida real de les lletres + float ancho = ancho_sin_escalar * ESCALA_FINAL; + float offset_centre = (forma->get_centre().x - min_x) * ESCALA_FINAL; lletres_.push_back({ forma, {0.0f, 0.0f}, // Posició es calcularà després - ancho + ancho, + offset_centre }); ancho_total += ancho; @@ -115,8 +147,10 @@ void EscenaLogo::inicialitzar_lletres() { float x_actual = x_inicial; for (auto& lletra : lletres_) { - // Centre de la lletra en pantalla - lletra.posicio.x = x_actual + lletra.ancho / 2.0f; + // Posicionar el centre de la forma (shape_centre) en pantalla + // Usar offset_centre en lloc de ancho/2 perquè shape_centre + // pot no estar exactament al mig del bounding box + lletra.posicio.x = x_actual + lletra.offset_centre; lletra.posicio.y = y_centre; // Avançar per a següent lletra @@ -127,22 +161,6 @@ void EscenaLogo::inicialitzar_lletres() { << " lletres carregades, ancho total: " << ancho_total << " px\n"; } -float EscenaLogo::calcular_escala_zoom(float temps) const { - if (temps >= DURACIO_ZOOM) { - return ESCALA_FINAL; // Animació acabada - } - - // Progrés normalitzat (0.0 a 1.0) - float t = temps / DURACIO_ZOOM; - - // Ease-out quadràtic: y = 1 - (1-t)^2 - // Comença ràpid, acaba suau - float factor = 1.0f - (1.0f - t) * (1.0f - t); - - // Interpolar entre escala inicial i final - return ESCALA_INICIAL + (ESCALA_FINAL - ESCALA_INICIAL) * factor; -} - void EscenaLogo::actualitzar(float delta_time) { temps_acumulat_ += delta_time; @@ -156,18 +174,45 @@ void EscenaLogo::dibuixar() { // Fons negre sdl_.neteja(0, 0, 0); - // Calcular escala actual del zoom - float escala = calcular_escala_zoom(temps_acumulat_); + // Progrés global normalitzat (0.0 → 1.0) + float global_progress = std::min(temps_acumulat_ / DURACIO_ZOOM, 1.0f); - // Dibuixar cada lletra amb l'escala animada - for (const auto& lletra : lletres_) { + // Centre de la pantalla (punt inicial de totes les lletres) + constexpr Punt CENTRE_PANTALLA = {640.0f / 2.0f, 480.0f / 2.0f}; + + // Dibuixar cada lletra amb animació seqüencial + for (size_t i = 0; i < lletres_.size(); i++) { + const auto& lletra = lletres_[i]; + + // Calcular progrés individual d'aquesta lletra (0.0 → 1.0) + float letra_progress = calcular_progress_letra(i, lletres_.size(), global_progress); + + // Si la lletra encara no ha començat, saltar-la + if (letra_progress <= 0.0f) { + continue; + } + + // Interpolar posició: des del centre cap a posició final + Punt pos_actual; + pos_actual.x = CENTRE_PANTALLA.x + (lletra.posicio.x - CENTRE_PANTALLA.x) * letra_progress; + pos_actual.y = CENTRE_PANTALLA.y + (lletra.posicio.y - CENTRE_PANTALLA.y) * letra_progress; + + // Aplicar ease-out quadràtic per suavitat + float t = letra_progress; + float ease_factor = 1.0f - (1.0f - t) * (1.0f - t); + + // Interpolar escala amb ease-out: des de ESCALA_INICIAL cap a ESCALA_FINAL + float escala_actual = ESCALA_INICIAL + (ESCALA_FINAL - ESCALA_INICIAL) * ease_factor; + + // Renderitzar la lletra Rendering::render_shape( sdl_.obte_renderer(), lletra.forma, - lletra.posicio, // Posició en pantalla - 0.0f, // Sense rotació - escala, // Escala animada - true // Dibuixar + pos_actual, // Posició interpolada + 0.0f, // Sense rotació + escala_actual, // Escala interpolada amb ease-out + true, // Dibuixar + 1.0f // Progress = 1.0 (lletra completa, sense animació de primitives) ); } diff --git a/source/game/escenes/escena_logo.hpp b/source/game/escenes/escena_logo.hpp index 5a7edf9..2cb3c38 100644 --- a/source/game/escenes/escena_logo.hpp +++ b/source/game/escenes/escena_logo.hpp @@ -23,22 +23,22 @@ private: // Estructura per a cada lletra del logo struct LetraLogo { std::shared_ptr forma; - Punt posicio; // Posició final en pantalla - float ancho; // Ancho per a càlcul de centrat + Punt posicio; // Posició final en pantalla + float ancho; // Ancho del bounding box + float offset_centre; // Distància de min_x a shape_centre.x }; std::vector lletres_; // 9 lletres: J-A-I-L-G-A-M-E-S // Constants d'animació - static constexpr float DURACIO_ZOOM = 1.5f; // Duració del zoom (segons) - static constexpr float DURACIO_TOTAL = 3.0f; // Duració total abans d'anar al joc + static constexpr float DURACIO_ZOOM = 4.0f; // Duració del zoom (segons) + static constexpr float DURACIO_TOTAL = 20.0f; // Duració total abans d'anar al joc static constexpr float ESCALA_INICIAL = 0.1f; // Escala inicial (10%) - static constexpr float ESCALA_FINAL = 1.0f; // Escala final (100%) + static constexpr float ESCALA_FINAL = 0.8f; // Escala final (100%) static constexpr float ESPAI_ENTRE_LLETRES = 10.0f; // Espaiat entre lletres // Mètodes privats void inicialitzar_lletres(); - float calcular_escala_zoom(float temps) const; void actualitzar(float delta_time); void dibuixar(); void processar_events(const SDL_Event& event);