el marcador fake ja es pinta correctament
This commit is contained in:
@@ -2,20 +2,18 @@
|
||||
// © 2025 Port a C++20
|
||||
|
||||
#include "escena_logo.hpp"
|
||||
#include "../../core/system/gestor_escenes.hpp"
|
||||
#include "../../core/system/global_events.hpp"
|
||||
#include "../../core/graphics/shape_loader.hpp"
|
||||
#include "../../core/rendering/shape_renderer.hpp"
|
||||
#include <iostream>
|
||||
#include <cfloat>
|
||||
#include "../../core/system/gestor_escenes.hpp"
|
||||
#include "../../core/system/global_events.hpp"
|
||||
#include <algorithm>
|
||||
#include <cfloat>
|
||||
#include <iostream>
|
||||
|
||||
// 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,
|
||||
float threshold) {
|
||||
static float calcular_progress_letra(size_t letra_index, size_t num_letras,
|
||||
float global_progress, float threshold) {
|
||||
if (num_letras == 0)
|
||||
return 1.0f;
|
||||
|
||||
@@ -27,18 +25,17 @@ static float calcular_progress_letra(size_t letra_index,
|
||||
|
||||
// Interpolar progrés
|
||||
if (global_progress < start) {
|
||||
return 0.0f; // Encara no ha començat
|
||||
return 0.0f; // Encara no ha començat
|
||||
} else if (global_progress >= end) {
|
||||
return 1.0f; // Completament apareguda
|
||||
return 1.0f; // Completament apareguda
|
||||
} else {
|
||||
return (global_progress - start) / (end - start);
|
||||
}
|
||||
}
|
||||
|
||||
EscenaLogo::EscenaLogo(SDLManager& sdl)
|
||||
: sdl_(sdl),
|
||||
estat_actual_(EstatAnimacio::PRE_ANIMATION),
|
||||
temps_estat_actual_(0.0f) {
|
||||
EscenaLogo::EscenaLogo(SDLManager &sdl)
|
||||
: sdl_(sdl), estat_actual_(EstatAnimacio::PRE_ANIMATION),
|
||||
temps_estat_actual_(0.0f) {
|
||||
std::cout << "Escena Logo: Inicialitzant...\n";
|
||||
inicialitzar_lletres();
|
||||
}
|
||||
@@ -92,14 +89,14 @@ void EscenaLogo::inicialitzar_lletres() {
|
||||
|
||||
// Llista de fitxers .shp (A repetida per a les dues A's)
|
||||
std::vector<std::string> fitxers = {
|
||||
"logo/letra_j.shp", "logo/letra_a.shp", "logo/letra_i.shp", "logo/letra_l.shp",
|
||||
"logo/letra_g.shp", "logo/letra_a.shp", "logo/letra_m.shp", "logo/letra_e.shp", "logo/letra_s.shp"
|
||||
};
|
||||
"logo/letra_j.shp", "logo/letra_a.shp", "logo/letra_i.shp",
|
||||
"logo/letra_l.shp", "logo/letra_g.shp", "logo/letra_a.shp",
|
||||
"logo/letra_m.shp", "logo/letra_e.shp", "logo/letra_s.shp"};
|
||||
|
||||
// Pas 1: Carregar totes les formes i calcular amplades
|
||||
float ancho_total = 0.0f;
|
||||
|
||||
for (const auto& fitxer : fitxers) {
|
||||
for (const auto &fitxer : fitxers) {
|
||||
auto forma = ShapeLoader::load(fitxer);
|
||||
if (!forma || !forma->es_valida()) {
|
||||
std::cerr << "[EscenaLogo] Error carregant " << fitxer << std::endl;
|
||||
@@ -110,8 +107,8 @@ void EscenaLogo::inicialitzar_lletres() {
|
||||
float min_x = FLT_MAX;
|
||||
float max_x = -FLT_MAX;
|
||||
|
||||
for (const auto& prim : forma->get_primitives()) {
|
||||
for (const auto& punt : prim.points) {
|
||||
for (const auto &prim : forma->get_primitives()) {
|
||||
for (const auto &punt : prim.points) {
|
||||
min_x = std::min(min_x, punt.x);
|
||||
max_x = std::max(max_x, punt.x);
|
||||
}
|
||||
@@ -124,12 +121,10 @@ void EscenaLogo::inicialitzar_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,
|
||||
offset_centre
|
||||
});
|
||||
lletres_.push_back({forma,
|
||||
{0.0f, 0.0f}, // Posició es calcularà després
|
||||
ancho,
|
||||
offset_centre});
|
||||
|
||||
ancho_total += ancho;
|
||||
}
|
||||
@@ -147,7 +142,7 @@ void EscenaLogo::inicialitzar_lletres() {
|
||||
// Pas 4: Assignar posicions a cada lletra
|
||||
float x_actual = x_inicial;
|
||||
|
||||
for (auto& lletra : lletres_) {
|
||||
for (auto &lletra : lletres_) {
|
||||
// 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
|
||||
@@ -164,8 +159,9 @@ void EscenaLogo::inicialitzar_lletres() {
|
||||
|
||||
void EscenaLogo::canviar_estat(EstatAnimacio nou_estat) {
|
||||
estat_actual_ = nou_estat;
|
||||
temps_estat_actual_ = 0.0f; // Reset temps
|
||||
std::cout << "[EscenaLogo] Canvi a estat: " << static_cast<int>(nou_estat) << "\n";
|
||||
temps_estat_actual_ = 0.0f; // Reset temps
|
||||
std::cout << "[EscenaLogo] Canvi a estat: " << static_cast<int>(nou_estat)
|
||||
<< "\n";
|
||||
}
|
||||
|
||||
bool EscenaLogo::totes_lletres_completes() const {
|
||||
@@ -177,23 +173,23 @@ void EscenaLogo::actualitzar(float delta_time) {
|
||||
temps_estat_actual_ += delta_time;
|
||||
|
||||
switch (estat_actual_) {
|
||||
case EstatAnimacio::PRE_ANIMATION:
|
||||
if (temps_estat_actual_ >= DURACIO_PRE) {
|
||||
canviar_estat(EstatAnimacio::ANIMATION);
|
||||
}
|
||||
break;
|
||||
case EstatAnimacio::PRE_ANIMATION:
|
||||
if (temps_estat_actual_ >= DURACIO_PRE) {
|
||||
canviar_estat(EstatAnimacio::ANIMATION);
|
||||
}
|
||||
break;
|
||||
|
||||
case EstatAnimacio::ANIMATION:
|
||||
if (totes_lletres_completes()) {
|
||||
canviar_estat(EstatAnimacio::POST_ANIMATION);
|
||||
}
|
||||
break;
|
||||
case EstatAnimacio::ANIMATION:
|
||||
if (totes_lletres_completes()) {
|
||||
canviar_estat(EstatAnimacio::POST_ANIMATION);
|
||||
}
|
||||
break;
|
||||
|
||||
case EstatAnimacio::POST_ANIMATION:
|
||||
if (temps_estat_actual_ >= DURACIO_POST) {
|
||||
GestorEscenes::actual = GestorEscenes::Escena::JOC;
|
||||
}
|
||||
break;
|
||||
case EstatAnimacio::POST_ANIMATION:
|
||||
if (temps_estat_actual_ >= DURACIO_POST) {
|
||||
GestorEscenes::actual = GestorEscenes::Escena::JOC;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,23 +200,25 @@ void EscenaLogo::dibuixar() {
|
||||
// PRE_ANIMATION: Només pantalla negra
|
||||
if (estat_actual_ == EstatAnimacio::PRE_ANIMATION) {
|
||||
sdl_.presenta();
|
||||
return; // No renderitzar lletres
|
||||
return; // No renderitzar lletres
|
||||
}
|
||||
|
||||
// ANIMATION o POST_ANIMATION: Calcular progrés
|
||||
float global_progress = (estat_actual_ == EstatAnimacio::ANIMATION)
|
||||
? std::min(temps_estat_actual_ / DURACIO_ZOOM, 1.0f)
|
||||
: 1.0f; // POST: mantenir al 100%
|
||||
float global_progress =
|
||||
(estat_actual_ == EstatAnimacio::ANIMATION)
|
||||
? std::min(temps_estat_actual_ / DURACIO_ZOOM, 1.0f)
|
||||
: 1.0f; // POST: mantenir al 100%
|
||||
|
||||
// Punt inicial del zoom (configurable amb ORIGEN_ZOOM_X/Y)
|
||||
const Punt ORIGEN_ZOOM = {ORIGEN_ZOOM_X, ORIGEN_ZOOM_Y};
|
||||
|
||||
// Dibuixar cada lletra amb animació seqüencial
|
||||
for (size_t i = 0; i < lletres_.size(); i++) {
|
||||
const auto& lletra = lletres_[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, THRESHOLD_LETRA);
|
||||
float letra_progress = calcular_progress_letra(
|
||||
i, lletres_.size(), global_progress, THRESHOLD_LETRA);
|
||||
|
||||
// Si la lletra encara no ha començat, saltar-la
|
||||
if (letra_progress <= 0.0f) {
|
||||
@@ -229,32 +227,34 @@ void EscenaLogo::dibuixar() {
|
||||
|
||||
// Interpolar posició: des del origen zoom cap a posició final
|
||||
Punt pos_actual;
|
||||
pos_actual.x = ORIGEN_ZOOM.x + (lletra.posicio.x - ORIGEN_ZOOM.x) * letra_progress;
|
||||
pos_actual.y = ORIGEN_ZOOM.y + (lletra.posicio.y - ORIGEN_ZOOM.y) * letra_progress;
|
||||
pos_actual.x =
|
||||
ORIGEN_ZOOM.x + (lletra.posicio.x - ORIGEN_ZOOM.x) * letra_progress;
|
||||
pos_actual.y =
|
||||
ORIGEN_ZOOM.y + (lletra.posicio.y - ORIGEN_ZOOM.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;
|
||||
float escala_actual =
|
||||
ESCALA_INICIAL + (ESCALA_FINAL - ESCALA_INICIAL) * ease_factor;
|
||||
|
||||
// Renderitzar la lletra
|
||||
Rendering::render_shape(
|
||||
sdl_.obte_renderer(),
|
||||
lletra.forma,
|
||||
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)
|
||||
sdl_.obte_renderer(), lletra.forma,
|
||||
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)
|
||||
);
|
||||
}
|
||||
|
||||
sdl_.presenta();
|
||||
}
|
||||
|
||||
void EscenaLogo::processar_events(const SDL_Event& event) {
|
||||
void EscenaLogo::processar_events(const SDL_Event &event) {
|
||||
// Qualsevol tecla o clic de ratolí salta al joc
|
||||
if (event.type == SDL_EVENT_KEY_DOWN ||
|
||||
event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
|
||||
|
||||
Reference in New Issue
Block a user