afegit fade in al starfield de TITOL

This commit is contained in:
2025-12-04 08:24:08 +01:00
parent cdc4d07394
commit 2caaa29124
2 changed files with 67 additions and 47 deletions

View File

@@ -16,15 +16,10 @@
#include "core/system/global_events.hpp" #include "core/system/global_events.hpp"
#include "project.h" #include "project.h"
namespace {
// Brightness del starfield (1.0 = default, >1.0 més brillant, <1.0 menys brillant)
constexpr float BRIGHTNESS_STARFIELD = 1.2f;
} // namespace
EscenaTitol::EscenaTitol(SDLManager& sdl) EscenaTitol::EscenaTitol(SDLManager& sdl)
: sdl_(sdl), : sdl_(sdl),
text_(sdl.obte_renderer()), text_(sdl.obte_renderer()),
estat_actual_(EstatTitol::INIT), estat_actual_(EstatTitol::STARFIELD_FADE_IN),
temps_acumulat_(0.0f), temps_acumulat_(0.0f),
temps_animacio_(0.0f), temps_animacio_(0.0f),
temps_estat_main_(0.0f), temps_estat_main_(0.0f),
@@ -50,8 +45,8 @@ EscenaTitol::EscenaTitol(SDLManager& sdl)
150 // densitat: 150 estrelles (50 per capa) 150 // densitat: 150 estrelles (50 per capa)
); );
// Configurar brightness del starfield // Iniciar amb brightness 0.0 per al fade-in
starfield_->set_brightness(BRIGHTNESS_STARFIELD); starfield_->set_brightness(0.0f);
// Inicialitzar lletres del títol "ORNI ATTACK!" // Inicialitzar lletres del títol "ORNI ATTACK!"
inicialitzar_titol(); inicialitzar_titol();
@@ -286,7 +281,26 @@ void EscenaTitol::actualitzar(float delta_time) {
} }
switch (estat_actual_) { switch (estat_actual_) {
case EstatTitol::INIT: case EstatTitol::STARFIELD_FADE_IN: {
temps_acumulat_ += delta_time;
// Calcular progrés del fade (0.0 → 1.0)
float progress = std::min(1.0f, temps_acumulat_ / DURACIO_FADE_IN);
// Lerp brightness de 0.0 a BRIGHTNESS_STARFIELD
float brightness_actual = progress * BRIGHTNESS_STARFIELD;
starfield_->set_brightness(brightness_actual);
// Transició a STARFIELD quan el fade es completa
if (temps_acumulat_ >= DURACIO_FADE_IN) {
estat_actual_ = EstatTitol::STARFIELD;
temps_acumulat_ = 0.0f; // Reset timer per al següent estat
starfield_->set_brightness(BRIGHTNESS_STARFIELD); // Assegurar valor final
}
break;
}
case EstatTitol::STARFIELD:
temps_acumulat_ += delta_time; temps_acumulat_ += delta_time;
if (temps_acumulat_ >= DURACIO_INIT) { if (temps_acumulat_ >= DURACIO_INIT) {
estat_actual_ = EstatTitol::MAIN; estat_actual_ = EstatTitol::MAIN;
@@ -345,7 +359,7 @@ void EscenaTitol::actualitzar(float delta_time) {
break; break;
} }
case EstatTitol::TRANSITION: case EstatTitol::TRANSITION_TO_GAME:
temps_acumulat_ += delta_time; temps_acumulat_ += delta_time;
if (temps_acumulat_ >= DURACIO_TRANSITION) { if (temps_acumulat_ >= DURACIO_TRANSITION) {
// Transició a JOC (la música ja s'ha parat en el fade) // Transició a JOC (la música ja s'ha parat en el fade)
@@ -361,13 +375,13 @@ void EscenaTitol::dibuixar() {
starfield_->dibuixar(); starfield_->dibuixar();
} }
// En l'estat INIT, només mostrar starfield (sense text) // En els estats STARFIELD_FADE_IN i STARFIELD, només mostrar starfield (sense text)
if (estat_actual_ == EstatTitol::INIT) { if (estat_actual_ == EstatTitol::STARFIELD_FADE_IN || estat_actual_ == EstatTitol::STARFIELD) {
return; return;
} }
// Estat MAIN i TRANSITION: Dibuixar títol i text (sobre el starfield) // Estat MAIN i TRANSITION: Dibuixar títol i text (sobre el starfield)
if (estat_actual_ == EstatTitol::MAIN || estat_actual_ == EstatTitol::TRANSITION) { if (estat_actual_ == EstatTitol::MAIN || estat_actual_ == EstatTitol::TRANSITION_TO_GAME) {
// === Calcular i renderitzar ombra (només si animació activa) === // === Calcular i renderitzar ombra (només si animació activa) ===
if (animacio_activa_) { if (animacio_activa_) {
float temps_shadow = temps_animacio_ - SHADOW_DELAY; float temps_shadow = temps_animacio_ - SHADOW_DELAY;
@@ -380,10 +394,8 @@ void EscenaTitol::dibuixar() {
float frequency_y_shadow = ORBIT_FREQUENCY_Y; float frequency_y_shadow = ORBIT_FREQUENCY_Y;
// Calcular offset de l'ombra // Calcular offset de l'ombra
float shadow_offset_x = amplitude_x_shadow * std::sin(2.0f * Defaults::Math::PI * frequency_x_shadow * temps_shadow) float shadow_offset_x = amplitude_x_shadow * std::sin(2.0f * Defaults::Math::PI * frequency_x_shadow * temps_shadow) + SHADOW_OFFSET_X;
+ SHADOW_OFFSET_X; float shadow_offset_y = amplitude_y_shadow * std::sin(2.0f * Defaults::Math::PI * frequency_y_shadow * temps_shadow + ORBIT_PHASE_OFFSET) + SHADOW_OFFSET_Y;
float shadow_offset_y = amplitude_y_shadow * std::sin(2.0f * Defaults::Math::PI * frequency_y_shadow * temps_shadow + ORBIT_PHASE_OFFSET)
+ SHADOW_OFFSET_Y;
// === RENDERITZAR OMBRA PRIMER (darrera del logo principal) === // === RENDERITZAR OMBRA PRIMER (darrera del logo principal) ===
@@ -419,8 +431,7 @@ void EscenaTitol::dibuixar() {
ESCALA_TITULO, ESCALA_TITULO,
true, true,
1.0f, // progress = 1.0 (totalment visible) 1.0f, // progress = 1.0 (totalment visible)
SHADOW_BRIGHTNESS SHADOW_BRIGHTNESS);
);
} }
} }
@@ -459,7 +470,7 @@ void EscenaTitol::dibuixar() {
const float spacing = 2.0f; // Espai entre caràcters (usat també per copyright) const float spacing = 2.0f; // Espai entre caràcters (usat també per copyright)
bool mostrar_text = true; bool mostrar_text = true;
if (estat_actual_ == EstatTitol::TRANSITION) { if (estat_actual_ == EstatTitol::TRANSITION_TO_GAME) {
// Parpelleig: sin oscil·la entre -1 i 1, volem ON quan > 0 // Parpelleig: sin oscil·la entre -1 i 1, volem ON quan > 0
float fase = temps_acumulat_ * BLINK_FREQUENCY * 2.0f * 3.14159f; // 2π × freq × temps float fase = temps_acumulat_ * BLINK_FREQUENCY * 2.0f * 3.14159f; // 2π × freq × temps
mostrar_text = (std::sin(fase) > 0.0f); mostrar_text = (std::sin(fase) > 0.0f);
@@ -503,19 +514,25 @@ void EscenaTitol::processar_events(const SDL_Event& event) {
if (event.type == SDL_EVENT_KEY_DOWN || if (event.type == SDL_EVENT_KEY_DOWN ||
event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) { event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
switch (estat_actual_) { switch (estat_actual_) {
case EstatTitol::INIT: case EstatTitol::STARFIELD_FADE_IN:
// Saltar directament a MAIN (ometre fade-in i starfield)
estat_actual_ = EstatTitol::MAIN;
starfield_->set_brightness(BRIGHTNESS_STARFIELD); // Assegurar brightness final
break;
case EstatTitol::STARFIELD:
// Saltar a MAIN // Saltar a MAIN
estat_actual_ = EstatTitol::MAIN; estat_actual_ = EstatTitol::MAIN;
break; break;
case EstatTitol::MAIN: case EstatTitol::MAIN:
// Iniciar transició amb fade-out de música // Iniciar transició amb fade-out de música
estat_actual_ = EstatTitol::TRANSITION; estat_actual_ = EstatTitol::TRANSITION_TO_GAME;
temps_acumulat_ = 0.0f; // Reset del comptador temps_acumulat_ = 0.0f; // Reset del comptador
Audio::get()->fadeOutMusic(MUSIC_FADE); // Fade de 300ms Audio::get()->fadeOutMusic(MUSIC_FADE); // Fade de 300ms
break; break;
case EstatTitol::TRANSITION: case EstatTitol::TRANSITION_TO_GAME:
// Ignorar inputs durant la transició // Ignorar inputs durant la transició
break; break;
} }

View File

@@ -25,9 +25,10 @@ class EscenaTitol {
private: private:
// Màquina d'estats per la pantalla de títol // Màquina d'estats per la pantalla de títol
enum class EstatTitol { enum class EstatTitol {
INIT, // Pantalla negra inicial (2 segons) STARFIELD_FADE_IN, // Fade-in del starfield (1.5s)
STARFIELD, // Pantalla con el campo de estrellas
MAIN, // Pantalla de títol amb text MAIN, // Pantalla de títol amb text
TRANSITION // Transició amb fade-out de música i text parpellejant TRANSITION_TO_GAME // Transició amb fade-out de música i text parpellejant
}; };
// Estructura per emmagatzemar informació de cada lletra del títol // Estructura per emmagatzemar informació de cada lletra del títol
@@ -61,6 +62,8 @@ class EscenaTitol {
float factor_lerp_; // Factor de lerp actual (0.0 → 1.0) float factor_lerp_; // Factor de lerp actual (0.0 → 1.0)
// Constants // Constants
static constexpr float BRIGHTNESS_STARFIELD = 1.2f; // Brightness del starfield (>1.0 = més brillant)
static constexpr float DURACIO_FADE_IN = 3.0f; // Duració del fade-in del starfield (1.5 segons)
static constexpr float DURACIO_INIT = 4.0f; // Duració de l'estat INIT (2 segons) static constexpr float DURACIO_INIT = 4.0f; // Duració de l'estat INIT (2 segons)
static constexpr float DURACIO_TRANSITION = 1.5f; // Duració de la transició (1.5 segons) static constexpr float DURACIO_TRANSITION = 1.5f; // Duració de la transició (1.5 segons)
static constexpr float ESCALA_TITULO = 0.6f; // Escala per les lletres del títol (50%) static constexpr float ESCALA_TITULO = 0.6f; // Escala per les lletres del títol (50%)