millorada la gestio d'escenes i opcions
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
70
source/core/system/context_escenes.hpp
Normal file
70
source/core/system/context_escenes.hpp
Normal 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
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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_;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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ó)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user