millorada la gestio d'escenes i opcions

This commit is contained in:
2025-12-04 11:51:41 +01:00
parent f8c5207d5c
commit 330044e10f
12 changed files with 195 additions and 59 deletions

View File

@@ -14,8 +14,7 @@
class SDLManager { class SDLManager {
public: public:
SDLManager(); // Constructor per defecte (usa Defaults::) SDLManager(); // Constructor per defecte (usa Defaults::)
SDLManager(int width, int height, SDLManager(int width, int height, bool fullscreen); // Constructor amb configuració
bool fullscreen); // Constructor amb configuració
~SDLManager(); ~SDLManager();
// No permetre còpia ni assignació // No permetre còpia ni assignació
@@ -27,8 +26,7 @@ class SDLManager {
void decreaseWindowSize(); // F1: -100px void decreaseWindowSize(); // F1: -100px
void toggleFullscreen(); // F3 void toggleFullscreen(); // F3
void toggleVSync(); // F4 void toggleVSync(); // F4
bool bool handleWindowEvent(const SDL_Event& event); // Per a SDL_EVENT_WINDOW_RESIZED
handleWindowEvent(const SDL_Event& event); // Per a SDL_EVENT_WINDOW_RESIZED
// Funcions principals (renderitzat) // Funcions principals (renderitzat)
void neteja(uint8_t r = 0, uint8_t g = 0, uint8_t b = 0); void neteja(uint8_t r = 0, uint8_t g = 0, uint8_t b = 0);

View File

@@ -0,0 +1,70 @@
// context_escenes.hpp - Sistema de gestió d'escenes i context de transicions
// © 2025 Port a C++20
#pragma once
namespace GestorEscenes {
// Context de transició entre escenes
// Conté l'escena destinació i opcions específiques per aquella escena
class ContextEscenes {
public:
// Tipus d'escena del joc
enum class Escena {
LOGO, // Pantalla d'inici (logo JAILGAMES)
TITOL, // Pantalla de títol amb menú
JOC, // Joc principal (Asteroids)
EIXIR // Sortir del programa
};
// Opcions específiques per a cada escena
enum class Opcio {
NONE, // Sense opcions especials (comportament per defecte)
JUMP_TO_TITLE_MAIN, // TITOL: Saltar directament a MAIN (starfield instantani)
// MODE_DEMO, // JOC: Mode demostració amb IA (futur)
};
// Constructor inicial amb escena LOGO i sense opcions
ContextEscenes()
: escena_desti_(Escena::LOGO),
opcio_(Opcio::NONE) {}
// Canviar escena amb opció específica
void canviar_escena(Escena nova_escena, Opcio opcio = Opcio::NONE) {
escena_desti_ = nova_escena;
opcio_ = opcio;
}
// Consultar escena destinació
[[nodiscard]] auto escena_desti() const -> Escena {
return escena_desti_;
}
// Consultar opció actual
[[nodiscard]] auto opcio() const -> Opcio {
return opcio_;
}
// Consumir opció (retorna valor i reseteja a NONE)
// Utilitzar quan l'escena processa l'opció
[[nodiscard]] auto consumir_opcio() -> Opcio {
Opcio valor = opcio_;
opcio_ = Opcio::NONE;
return valor;
}
// Reset opció a NONE (sense retornar valor)
void reset_opcio() {
opcio_ = Opcio::NONE;
}
private:
Escena escena_desti_; // Escena a la qual transicionar
Opcio opcio_; // Opció específica per l'escena
};
// Variable global inline per gestionar l'escena actual (backward compatibility)
// Sincronitzada amb context.escena_desti() pel Director
inline ContextEscenes::Escena actual = ContextEscenes::Escena::LOGO;
} // namespace GestorEscenes

View File

@@ -15,7 +15,7 @@
#include "game/escenes/escena_logo.hpp" #include "game/escenes/escena_logo.hpp"
#include "game/escenes/escena_titol.hpp" #include "game/escenes/escena_titol.hpp"
#include "game/options.hpp" #include "game/options.hpp"
#include "gestor_escenes.hpp" #include "context_escenes.hpp"
#include "project.h" #include "project.h"
#ifndef _WIN32 #ifndef _WIN32
@@ -23,6 +23,10 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
// Using declarations per simplificar el codi
using GestorEscenes::ContextEscenes;
using Escena = ContextEscenes::Escena;
// Constructor // Constructor
Director::Director(std::vector<std::string> const& args) { Director::Director(std::vector<std::string> const& args) {
std::cout << "Orni Attack - Inici\n"; std::cout << "Orni Attack - Inici\n";
@@ -169,23 +173,31 @@ auto Director::run() -> int {
<< AudioCache::getMusicCacheSize() << " fitxers\n"; << AudioCache::getMusicCacheSize() << " fitxers\n";
} }
// Crear context d'escenes
ContextEscenes context;
context.canviar_escena(Escena::LOGO);
// Bucle principal de gestió d'escenes // Bucle principal de gestió d'escenes
while (GestorEscenes::actual != GestorEscenes::Escena::EIXIR) { while (context.escena_desti() != Escena::EIXIR) {
switch (GestorEscenes::actual) { // Sincronitzar GestorEscenes::actual amb context
case GestorEscenes::Escena::LOGO: { // (altres sistemes encara poden llegir GestorEscenes::actual)
EscenaLogo logo(sdl); GestorEscenes::actual = context.escena_desti();
switch (context.escena_desti()) {
case Escena::LOGO: {
EscenaLogo logo(sdl, context);
logo.executar(); logo.executar();
break; break;
} }
case GestorEscenes::Escena::TITOL: { case Escena::TITOL: {
EscenaTitol titol(sdl); EscenaTitol titol(sdl, context);
titol.executar(); titol.executar();
break; break;
} }
case GestorEscenes::Escena::JOC: { case Escena::JOC: {
EscenaJoc joc(sdl); EscenaJoc joc(sdl, context);
joc.executar(); joc.executar();
break; break;
} }
@@ -195,5 +207,8 @@ auto Director::run() -> int {
} }
} }
// Sincronitzar final amb GestorEscenes::actual
GestorEscenes::actual = Escena::EIXIR;
return 0; return 0;
} }

View File

@@ -1,17 +0,0 @@
// gestor_escenes.hpp - Sistema de gestió d'escenes
// Basat en el patró del projecte "pollo"
// © 2025 Port a C++20
#pragma once
namespace GestorEscenes {
enum class Escena {
LOGO, // Pantalla d'inici (2 segons negre)
TITOL, // Pantalla de títol amb menú
JOC, // Joc principal
EIXIR // Sortir del programa
};
// Variable global inline per gestionar l'escena actual
inline Escena actual = Escena::LOGO;
} // namespace GestorEscenes

View File

@@ -5,11 +5,15 @@
#include "core/input/mouse.hpp" #include "core/input/mouse.hpp"
#include "core/rendering/sdl_manager.hpp" #include "core/rendering/sdl_manager.hpp"
#include "gestor_escenes.hpp" #include "context_escenes.hpp"
// Using declarations per simplificar el codi
using GestorEscenes::ContextEscenes;
using Escena = ContextEscenes::Escena;
namespace GlobalEvents { namespace GlobalEvents {
bool handle(const SDL_Event& event, SDLManager& sdl) { bool handle(const SDL_Event& event, SDLManager& sdl, ContextEscenes& context) {
// Tecles globals de finestra (F1/F2/F3) // Tecles globals de finestra (F1/F2/F3)
if (event.type == SDL_EVENT_KEY_DOWN) { if (event.type == SDL_EVENT_KEY_DOWN) {
switch (event.key.key) { switch (event.key.key) {
@@ -26,7 +30,8 @@ bool handle(const SDL_Event& event, SDLManager& sdl) {
sdl.toggleVSync(); sdl.toggleVSync();
return true; return true;
case SDLK_ESCAPE: case SDLK_ESCAPE:
GestorEscenes::actual = GestorEscenes::Escena::EIXIR; context.canviar_escena(Escena::EIXIR);
GestorEscenes::actual = Escena::EIXIR;
return true; return true;
default: default:
break; break;
@@ -35,7 +40,8 @@ bool handle(const SDL_Event& event, SDLManager& sdl) {
// Tancar finestra // Tancar finestra
if (event.type == SDL_EVENT_QUIT) { if (event.type == SDL_EVENT_QUIT) {
GestorEscenes::actual = GestorEscenes::Escena::EIXIR; context.canviar_escena(Escena::EIXIR);
GestorEscenes::actual = Escena::EIXIR;
return true; return true;
} }

View File

@@ -6,11 +6,12 @@
#include <SDL3/SDL.h> #include <SDL3/SDL.h>
// Forward declaration // Forward declarations
class SDLManager; class SDLManager;
namespace GestorEscenes { class ContextEscenes; }
namespace GlobalEvents { namespace GlobalEvents {
// Processa events globals (F1/F2/F3/ESC/QUIT) // Processa events globals (F1/F2/F3/ESC/QUIT)
// Retorna true si l'event ha estat processat i no cal seguir processant-lo // Retorna true si l'event ha estat processat i no cal seguir processant-lo
bool handle(const SDL_Event& event, SDLManager& sdl); bool handle(const SDL_Event& event, SDLManager& sdl, GestorEscenes::ContextEscenes& context);
} // namespace GlobalEvents } // namespace GlobalEvents

View File

@@ -13,16 +13,26 @@
#include "core/audio/audio.hpp" #include "core/audio/audio.hpp"
#include "core/input/mouse.hpp" #include "core/input/mouse.hpp"
#include "core/rendering/line_renderer.hpp" #include "core/rendering/line_renderer.hpp"
#include "core/system/gestor_escenes.hpp" #include "core/system/context_escenes.hpp"
#include "core/system/global_events.hpp" #include "core/system/global_events.hpp"
#include "game/stage_system/stage_loader.hpp" #include "game/stage_system/stage_loader.hpp"
EscenaJoc::EscenaJoc(SDLManager& sdl) // Using declarations per simplificar el codi
using GestorEscenes::ContextEscenes;
using Escena = ContextEscenes::Escena;
using Opcio = ContextEscenes::Opcio;
EscenaJoc::EscenaJoc(SDLManager& sdl, ContextEscenes& context)
: sdl_(sdl), : sdl_(sdl),
context_(context),
debris_manager_(sdl.obte_renderer()), debris_manager_(sdl.obte_renderer()),
nau_(sdl.obte_renderer()), nau_(sdl.obte_renderer()),
itocado_(0), itocado_(0),
text_(sdl.obte_renderer()) { text_(sdl.obte_renderer()) {
// Consumir opcions (preparació per MODE_DEMO futur)
auto opcio = context_.consumir_opcio();
(void)opcio; // Suprimir warning de variable no usada
// Inicialitzar bales amb renderer // Inicialitzar bales amb renderer
for (auto& bala : bales_) { for (auto& bala : bales_) {
bala = Bala(sdl.obte_renderer()); bala = Bala(sdl.obte_renderer());
@@ -43,7 +53,7 @@ void EscenaJoc::executar() {
SDL_Event event; SDL_Event event;
Uint64 last_time = SDL_GetTicks(); Uint64 last_time = SDL_GetTicks();
while (GestorEscenes::actual == GestorEscenes::Escena::JOC) { while (GestorEscenes::actual == Escena::JOC) {
// Calcular delta_time real // Calcular delta_time real
Uint64 current_time = SDL_GetTicks(); Uint64 current_time = SDL_GetTicks();
float delta_time = (current_time - last_time) / 1000.0f; float delta_time = (current_time - last_time) / 1000.0f;
@@ -68,7 +78,7 @@ void EscenaJoc::executar() {
} }
// Events globals (F1/F2/F3/ESC/QUIT) // Events globals (F1/F2/F3/ESC/QUIT)
if (GlobalEvents::handle(event, sdl_)) { if (GlobalEvents::handle(event, sdl_, context_)) {
continue; continue;
} }
@@ -158,8 +168,9 @@ void EscenaJoc::actualitzar(float delta_time) {
if (game_over_timer_ <= 0.0f) { if (game_over_timer_ <= 0.0f) {
// Aturar música de joc abans de tornar al títol // Aturar música de joc abans de tornar al títol
Audio::get()->stopMusic(); Audio::get()->stopMusic();
// Auto-transition to title screen // Transició a pantalla de títol
GestorEscenes::actual = GestorEscenes::Escena::TITOL; context_.canviar_escena(Escena::TITOL);
GestorEscenes::actual = Escena::TITOL;
return; return;
} }

View File

@@ -18,6 +18,7 @@
#include "../stage_system/stage_manager.hpp" #include "../stage_system/stage_manager.hpp"
#include "core/graphics/vector_text.hpp" #include "core/graphics/vector_text.hpp"
#include "core/rendering/sdl_manager.hpp" #include "core/rendering/sdl_manager.hpp"
#include "core/system/context_escenes.hpp"
#include "core/types.hpp" #include "core/types.hpp"
#include <memory> #include <memory>
@@ -25,7 +26,7 @@
// Classe principal del joc (escena) // Classe principal del joc (escena)
class EscenaJoc { class EscenaJoc {
public: public:
explicit EscenaJoc(SDLManager& sdl); explicit EscenaJoc(SDLManager& sdl, GestorEscenes::ContextEscenes& context);
~EscenaJoc() = default; ~EscenaJoc() = default;
void executar(); // Bucle principal de l'escena void executar(); // Bucle principal de l'escena
@@ -36,6 +37,7 @@ class EscenaJoc {
private: private:
SDLManager& sdl_; SDLManager& sdl_;
GestorEscenes::ContextEscenes& context_;
// Efectes visuals // Efectes visuals
Effects::DebrisManager debris_manager_; Effects::DebrisManager debris_manager_;

View File

@@ -13,9 +13,14 @@
#include "core/graphics/shape_loader.hpp" #include "core/graphics/shape_loader.hpp"
#include "core/input/mouse.hpp" #include "core/input/mouse.hpp"
#include "core/rendering/shape_renderer.hpp" #include "core/rendering/shape_renderer.hpp"
#include "core/system/gestor_escenes.hpp" #include "core/system/context_escenes.hpp"
#include "core/system/global_events.hpp" #include "core/system/global_events.hpp"
// Using declarations per simplificar el codi
using GestorEscenes::ContextEscenes;
using Escena = ContextEscenes::Escena;
using Opcio = ContextEscenes::Opcio;
// Helper: calcular el progrés individual d'una lletra // Helper: calcular el progrés individual d'una lletra
// en funció del progrés global (efecte seqüencial) // 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) {
@@ -38,14 +43,20 @@ static float calcular_progress_letra(size_t letra_index, size_t num_letras, floa
} }
} }
EscenaLogo::EscenaLogo(SDLManager& sdl) EscenaLogo::EscenaLogo(SDLManager& sdl, ContextEscenes& context)
: sdl_(sdl), : sdl_(sdl),
context_(context),
estat_actual_(EstatAnimacio::PRE_ANIMATION), estat_actual_(EstatAnimacio::PRE_ANIMATION),
temps_estat_actual_(0.0f), temps_estat_actual_(0.0f),
debris_manager_(std::make_unique<Effects::DebrisManager>(sdl.obte_renderer())), debris_manager_(std::make_unique<Effects::DebrisManager>(sdl.obte_renderer())),
lletra_explosio_index_(0), lletra_explosio_index_(0),
temps_des_ultima_explosio_(0.0f) { temps_des_ultima_explosio_(0.0f) {
std::cout << "Escena Logo: Inicialitzant...\n"; std::cout << "Escena Logo: Inicialitzant...\n";
// Consumir opcions (LOGO no processa opcions actualment)
auto opcio = context_.consumir_opcio();
(void)opcio; // Suprimir warning
so_reproduit_.fill(false); // Inicialitzar seguiment de sons so_reproduit_.fill(false); // Inicialitzar seguiment de sons
inicialitzar_lletres(); inicialitzar_lletres();
} }
@@ -54,7 +65,7 @@ void EscenaLogo::executar() {
SDL_Event event; SDL_Event event;
Uint64 last_time = SDL_GetTicks(); Uint64 last_time = SDL_GetTicks();
while (GestorEscenes::actual == GestorEscenes::Escena::LOGO) { while (GestorEscenes::actual == Escena::LOGO) {
// Calcular delta_time real // Calcular delta_time real
Uint64 current_time = SDL_GetTicks(); Uint64 current_time = SDL_GetTicks();
float delta_time = (current_time - last_time) / 1000.0f; float delta_time = (current_time - last_time) / 1000.0f;
@@ -79,7 +90,7 @@ void EscenaLogo::executar() {
} }
// Events globals (F1/F2/F3/ESC/QUIT) // Events globals (F1/F2/F3/ESC/QUIT)
if (GlobalEvents::handle(event, sdl_)) { if (GlobalEvents::handle(event, sdl_, context_)) {
continue; continue;
} }
@@ -292,8 +303,9 @@ void EscenaLogo::actualitzar(float delta_time) {
case EstatAnimacio::POST_EXPLOSION: case EstatAnimacio::POST_EXPLOSION:
if (temps_estat_actual_ >= DURACIO_POST_EXPLOSION) { if (temps_estat_actual_ >= DURACIO_POST_EXPLOSION) {
// Iniciar música de títol abans de la transició // Transició a pantalla de títol
GestorEscenes::actual = GestorEscenes::Escena::TITOL; context_.canviar_escena(Escena::TITOL);
GestorEscenes::actual = Escena::TITOL;
} }
break; break;
} }
@@ -394,6 +406,12 @@ void EscenaLogo::processar_events(const SDL_Event& event) {
// Qualsevol tecla o clic de ratolí salta a la pantalla de títol // Qualsevol tecla o clic de ratolí salta a la pantalla de títol
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) {
GestorEscenes::actual = GestorEscenes::Escena::TITOL; // Utilitzar context per especificar escena i opció
context_.canviar_escena(
Escena::TITOL,
Opcio::JUMP_TO_TITLE_MAIN
);
// Backward compatibility: També actualitzar GestorEscenes::actual
GestorEscenes::actual = Escena::TITOL;
} }
} }

View File

@@ -13,11 +13,12 @@
#include "core/defaults.hpp" #include "core/defaults.hpp"
#include "core/graphics/shape.hpp" #include "core/graphics/shape.hpp"
#include "core/rendering/sdl_manager.hpp" #include "core/rendering/sdl_manager.hpp"
#include "core/system/context_escenes.hpp"
#include "core/types.hpp" #include "core/types.hpp"
class EscenaLogo { class EscenaLogo {
public: public:
explicit EscenaLogo(SDLManager& sdl); explicit EscenaLogo(SDLManager& sdl, GestorEscenes::ContextEscenes& context);
void executar(); // Bucle principal de l'escena void executar(); // Bucle principal de l'escena
private: private:
@@ -31,6 +32,7 @@ class EscenaLogo {
}; };
SDLManager& sdl_; SDLManager& sdl_;
GestorEscenes::ContextEscenes& context_;
EstatAnimacio estat_actual_; // Estat actual de la màquina EstatAnimacio estat_actual_; // Estat actual de la màquina
float float
temps_estat_actual_; // Temps en l'estat actual (reset en cada transició) temps_estat_actual_; // Temps en l'estat actual (reset en cada transició)

View File

@@ -12,12 +12,18 @@
#include "core/graphics/shape_loader.hpp" #include "core/graphics/shape_loader.hpp"
#include "core/input/mouse.hpp" #include "core/input/mouse.hpp"
#include "core/rendering/shape_renderer.hpp" #include "core/rendering/shape_renderer.hpp"
#include "core/system/gestor_escenes.hpp" #include "core/system/context_escenes.hpp"
#include "core/system/global_events.hpp" #include "core/system/global_events.hpp"
#include "project.h" #include "project.h"
EscenaTitol::EscenaTitol(SDLManager& sdl) // Using declarations per simplificar el codi
using GestorEscenes::ContextEscenes;
using Escena = ContextEscenes::Escena;
using Opcio = ContextEscenes::Opcio;
EscenaTitol::EscenaTitol(SDLManager& sdl, ContextEscenes& context)
: sdl_(sdl), : sdl_(sdl),
context_(context),
text_(sdl.obte_renderer()), text_(sdl.obte_renderer()),
estat_actual_(EstatTitol::STARFIELD_FADE_IN), estat_actual_(EstatTitol::STARFIELD_FADE_IN),
temps_acumulat_(0.0f), temps_acumulat_(0.0f),
@@ -27,6 +33,15 @@ EscenaTitol::EscenaTitol(SDLManager& sdl)
factor_lerp_(0.0f) { factor_lerp_(0.0f) {
std::cout << "Escena Titol: Inicialitzant...\n"; std::cout << "Escena Titol: Inicialitzant...\n";
// Processar opció del context
auto opcio = context_.consumir_opcio();
if (opcio == Opcio::JUMP_TO_TITLE_MAIN) {
std::cout << "Escena Titol: Opció JUMP_TO_TITLE_MAIN activada\n";
estat_actual_ = EstatTitol::MAIN;
temps_estat_main_ = 0.0f;
}
// Crear starfield de fons // Crear starfield de fons
Punt centre_pantalla{ Punt centre_pantalla{
Defaults::Game::WIDTH / 2.0f, Defaults::Game::WIDTH / 2.0f,
@@ -45,8 +60,14 @@ EscenaTitol::EscenaTitol(SDLManager& sdl)
150 // densitat: 150 estrelles (50 per capa) 150 // densitat: 150 estrelles (50 per capa)
); );
// Iniciar amb brightness 0.0 per al fade-in // Brightness depèn de l'opció
starfield_->set_brightness(0.0f); if (estat_actual_ == EstatTitol::MAIN) {
// Si saltem a MAIN, starfield instantàniament brillant
starfield_->set_brightness(BRIGHTNESS_STARFIELD);
} else {
// Flux normal: comença amb brightness 0.0 per fade-in
starfield_->set_brightness(0.0f);
}
// Inicialitzar lletres del títol "ORNI ATTACK!" // Inicialitzar lletres del títol "ORNI ATTACK!"
inicialitzar_titol(); inicialitzar_titol();
@@ -216,7 +237,7 @@ void EscenaTitol::executar() {
SDL_Event event; SDL_Event event;
Uint64 last_time = SDL_GetTicks(); Uint64 last_time = SDL_GetTicks();
while (GestorEscenes::actual == GestorEscenes::Escena::TITOL) { while (GestorEscenes::actual == Escena::TITOL) {
// Calcular delta_time real // Calcular delta_time real
Uint64 current_time = SDL_GetTicks(); Uint64 current_time = SDL_GetTicks();
float delta_time = (current_time - last_time) / 1000.0f; float delta_time = (current_time - last_time) / 1000.0f;
@@ -241,7 +262,7 @@ void EscenaTitol::executar() {
} }
// Events globals (F1/F2/F3/F4/ESC/QUIT) // Events globals (F1/F2/F3/F4/ESC/QUIT)
if (GlobalEvents::handle(event, sdl_)) { if (GlobalEvents::handle(event, sdl_, context_)) {
continue; continue;
} }
@@ -365,7 +386,7 @@ void EscenaTitol::actualitzar(float delta_time) {
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)
GestorEscenes::actual = GestorEscenes::Escena::JOC; GestorEscenes::actual = Escena::JOC;
} }
break; break;
} }
@@ -520,14 +541,21 @@ void EscenaTitol::processar_events(const SDL_Event& event) {
// Saltar directament a MAIN (ometre fade-in i starfield) // Saltar directament a MAIN (ometre fade-in i starfield)
estat_actual_ = EstatTitol::MAIN; estat_actual_ = EstatTitol::MAIN;
starfield_->set_brightness(BRIGHTNESS_STARFIELD); // Assegurar brightness final starfield_->set_brightness(BRIGHTNESS_STARFIELD); // Assegurar brightness final
temps_estat_main_ = 0.0f; // Reset timer per animació de títol
break; break;
case EstatTitol::STARFIELD: case EstatTitol::STARFIELD:
// Saltar a MAIN // Saltar a MAIN
estat_actual_ = EstatTitol::MAIN; estat_actual_ = EstatTitol::MAIN;
temps_estat_main_ = 0.0f; // Reset timer
break; break;
case EstatTitol::MAIN: case EstatTitol::MAIN:
// Utilitzar context per transició a JOC
context_.canviar_escena(Escena::JOC);
// NO actualitzar GestorEscenes::actual aquí!
// La transició es fa en l'estat TRANSITION_TO_GAME
// Iniciar transició amb fade-out de música // Iniciar transició amb fade-out de música
estat_actual_ = EstatTitol::TRANSITION_TO_GAME; estat_actual_ = EstatTitol::TRANSITION_TO_GAME;
temps_acumulat_ = 0.0f; // Reset del comptador temps_acumulat_ = 0.0f; // Reset del comptador

View File

@@ -14,11 +14,12 @@
#include "core/graphics/starfield.hpp" #include "core/graphics/starfield.hpp"
#include "core/graphics/vector_text.hpp" #include "core/graphics/vector_text.hpp"
#include "core/rendering/sdl_manager.hpp" #include "core/rendering/sdl_manager.hpp"
#include "core/system/context_escenes.hpp"
#include "core/types.hpp" #include "core/types.hpp"
class EscenaTitol { class EscenaTitol {
public: public:
explicit EscenaTitol(SDLManager& sdl); explicit EscenaTitol(SDLManager& sdl, GestorEscenes::ContextEscenes& context);
~EscenaTitol(); // Destructor per aturar música ~EscenaTitol(); // Destructor per aturar música
void executar(); // Bucle principal de l'escena void executar(); // Bucle principal de l'escena
@@ -41,6 +42,7 @@ class EscenaTitol {
}; };
SDLManager& sdl_; SDLManager& sdl_;
GestorEscenes::ContextEscenes& context_;
Graphics::VectorText text_; // Sistema de text vectorial Graphics::VectorText text_; // Sistema de text vectorial
std::unique_ptr<Graphics::Starfield> starfield_; // Camp d'estrelles de fons std::unique_ptr<Graphics::Starfield> starfield_; // Camp d'estrelles de fons
EstatTitol estat_actual_; // Estat actual de la màquina EstatTitol estat_actual_; // Estat actual de la màquina