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 {
public:
SDLManager(); // Constructor per defecte (usa Defaults::)
SDLManager(int width, int height,
bool fullscreen); // Constructor amb configuració
SDLManager(int width, int height, bool fullscreen); // Constructor amb configuració
~SDLManager();
// No permetre còpia ni assignació
@@ -27,8 +26,7 @@ class SDLManager {
void decreaseWindowSize(); // F1: -100px
void toggleFullscreen(); // F3
void toggleVSync(); // F4
bool
handleWindowEvent(const SDL_Event& event); // Per a SDL_EVENT_WINDOW_RESIZED
bool handleWindowEvent(const SDL_Event& event); // Per a SDL_EVENT_WINDOW_RESIZED
// Funcions principals (renderitzat)
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_titol.hpp"
#include "game/options.hpp"
#include "gestor_escenes.hpp"
#include "context_escenes.hpp"
#include "project.h"
#ifndef _WIN32
@@ -23,6 +23,10 @@
#include <unistd.h>
#endif
// Using declarations per simplificar el codi
using GestorEscenes::ContextEscenes;
using Escena = ContextEscenes::Escena;
// Constructor
Director::Director(std::vector<std::string> const& args) {
std::cout << "Orni Attack - Inici\n";
@@ -169,23 +173,31 @@ auto Director::run() -> int {
<< AudioCache::getMusicCacheSize() << " fitxers\n";
}
// Crear context d'escenes
ContextEscenes context;
context.canviar_escena(Escena::LOGO);
// Bucle principal de gestió d'escenes
while (GestorEscenes::actual != GestorEscenes::Escena::EIXIR) {
switch (GestorEscenes::actual) {
case GestorEscenes::Escena::LOGO: {
EscenaLogo logo(sdl);
while (context.escena_desti() != Escena::EIXIR) {
// Sincronitzar GestorEscenes::actual amb context
// (altres sistemes encara poden llegir GestorEscenes::actual)
GestorEscenes::actual = context.escena_desti();
switch (context.escena_desti()) {
case Escena::LOGO: {
EscenaLogo logo(sdl, context);
logo.executar();
break;
}
case GestorEscenes::Escena::TITOL: {
EscenaTitol titol(sdl);
case Escena::TITOL: {
EscenaTitol titol(sdl, context);
titol.executar();
break;
}
case GestorEscenes::Escena::JOC: {
EscenaJoc joc(sdl);
case Escena::JOC: {
EscenaJoc joc(sdl, context);
joc.executar();
break;
}
@@ -195,5 +207,8 @@ auto Director::run() -> int {
}
}
// Sincronitzar final amb GestorEscenes::actual
GestorEscenes::actual = Escena::EIXIR;
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/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 {
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)
if (event.type == SDL_EVENT_KEY_DOWN) {
switch (event.key.key) {
@@ -26,7 +30,8 @@ bool handle(const SDL_Event& event, SDLManager& sdl) {
sdl.toggleVSync();
return true;
case SDLK_ESCAPE:
GestorEscenes::actual = GestorEscenes::Escena::EIXIR;
context.canviar_escena(Escena::EIXIR);
GestorEscenes::actual = Escena::EIXIR;
return true;
default:
break;
@@ -35,7 +40,8 @@ bool handle(const SDL_Event& event, SDLManager& sdl) {
// Tancar finestra
if (event.type == SDL_EVENT_QUIT) {
GestorEscenes::actual = GestorEscenes::Escena::EIXIR;
context.canviar_escena(Escena::EIXIR);
GestorEscenes::actual = Escena::EIXIR;
return true;
}

View File

@@ -6,11 +6,12 @@
#include <SDL3/SDL.h>
// Forward declaration
// Forward declarations
class SDLManager;
namespace GestorEscenes { class ContextEscenes; }
namespace GlobalEvents {
// Processa events globals (F1/F2/F3/ESC/QUIT)
// 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