c45e524109
Pase automático de clang-tidy --fix sobre el conjunto de checks que son puro transform de sintaxis y no rompen API. Invocado con --format-style=none para que clang-tidy NO arrastre clang-format sobre las líneas tocadas (evita la regla NamespaceIndentation: All del .clang-format reformateando solo trozos del archivo). Checks aplicados: - modernize-use-trailing-return-type (193 hits): 'int foo()' → 'auto foo() -> int'. Estilo coherente con la convención del proyecto. - modernize-use-default-member-init (36 hits): inicialización de miembros pasa de la lista del constructor a la declaración. Reduce duplicación cuando hay varios constructores con los mismos defaults. - modernize-use-auto (6 hits): tipos largos sustituidos por auto donde el tipo es evidente del contexto (new T, dynamic_cast, etc). - modernize-use-starts-ends-with (2 hits): s.rfind(x) == 0 → s.starts_with(x), aprovechando C++20. - performance-enum-size (10 hits): enums pequeños declaran tipo subyacente (uint8_t / similar) para reducir tamaño y precisar layout. NO aplicado en este pase (riesgo de cambios semánticos o de API): - readability-identifier-naming (renames pueden romper callsites parciales) - readability-convert-member-functions-to-static (cambia firma) - readability-use-anyofallof (reescribe loops, side effects) - readability-function-cognitive-complexity (requiere refactor manual) - bugs reales (bugprone-*, clang-diagnostic-*) → uno a uno Cambios manuales asociados: - SDLManager::clear() ahora devuelve bool: propaga el resultado de beginFrame al caller para que Director::runFrameLoop salte draw+present cuando la swapchain no esté disponible (ventana minimizada). Antes la función ignoraba el [[nodiscard]] del beginFrame y los vértices se acumulaban en el batch sin nadie que los consumiera. - vector_text.cpp: borrada la línea suelta "// Test pre-commit hook" que quedó como cruft. clang-tidy crashea en LLVM 19.1 con performance-noexcept-move-constructor (recursión infinita en ExceptionSpecAnalyzer al procesar std::set); check deshabilitado en .clang-tidy con comentario explicativo. Build limpio, smoke test OK. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
95 lines
4.2 KiB
C++
95 lines
4.2 KiB
C++
// logo_scene.hpp - Pantalla de start del juego
|
|
// Muestra logo JAILGAMES animat con zoom i salta al juego
|
|
// © 2026 JailDesigner
|
|
|
|
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <array>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "core/defaults.hpp"
|
|
#include "core/graphics/shape.hpp"
|
|
#include "core/input/input_types.hpp"
|
|
#include "core/rendering/sdl_manager.hpp"
|
|
#include "core/system/scene.hpp"
|
|
#include "core/system/scene_context.hpp"
|
|
#include "core/types.hpp"
|
|
#include "game/effects/debris_manager.hpp"
|
|
|
|
class LogoScene final : public Scene {
|
|
public:
|
|
explicit LogoScene(SDLManager& sdl, SceneManager::SceneContext& context);
|
|
~LogoScene() override; // Destructor per aturar sons
|
|
|
|
// Scene interface
|
|
void handleEvent(const SDL_Event& event) override;
|
|
void update(float delta_time) override;
|
|
void draw() override;
|
|
[[nodiscard]] auto isFinished() const -> bool override;
|
|
|
|
private:
|
|
// Màquina de estats per l'animación
|
|
enum class AnimationState {
|
|
PRE_ANIMATION, // Pantalla negra inicial
|
|
ANIMATION, // Animación de zoom de lletres
|
|
POST_ANIMATION, // Logo complet visible
|
|
EXPLOSION, // Explosión seqüencial de lletres
|
|
POST_EXPLOSION // Espera después de l'última explosión
|
|
};
|
|
|
|
SDLManager& sdl_;
|
|
SceneManager::SceneContext& context_;
|
|
AnimationState estat_actual_{AnimationState::PRE_ANIMATION}; // Estat actual de la màquina
|
|
float
|
|
temps_estat_actual_{0.0F}; // Temps en l'state actual (reset en cada transición)
|
|
|
|
// Gestor de fragments de explosions
|
|
std::unique_ptr<Effects::DebrisManager> debris_manager_;
|
|
|
|
// Seguiment de explosions seqüencials
|
|
size_t lletra_explosio_index_{0}; // Índex de la següent lletra a explode
|
|
float temps_des_ultima_explosio_{0.0F}; // Temps desde l'última explosión
|
|
std::vector<size_t> ordre_explosio_; // Ordre aleatori de índexs de lletres
|
|
|
|
// Estructura para cada lletra del logo
|
|
struct LetraLogo {
|
|
std::shared_ptr<Graphics::Shape> shape;
|
|
Vec2 position; // Posición final en pantalla
|
|
float ancho; // Ancho del bounding box
|
|
float offset_centre; // Distancia de min_x a shape_centre.x
|
|
};
|
|
|
|
std::vector<LetraLogo> lletres_; // 9 lletres: J-A-I-L-G-A-M-E-S
|
|
|
|
// Seguiment de sons de lletres (evitar reproduccions repetides)
|
|
std::array<bool, 9> so_reproduit_; // Track si cada lletra ya ha reproduit el so
|
|
|
|
// Constants de animación
|
|
static constexpr float DURACIO_PRE = 1.5F; // Duració PRE_ANIMATION (pantalla negra)
|
|
static constexpr float DURACIO_ZOOM = 4.0F; // Duració del zoom (segons)
|
|
static constexpr float DURACIO_POST_ANIMATION = 3.0F; // Duració POST_ANIMATION (logo complet)
|
|
static constexpr float DURACIO_POST_EXPLOSION = 3.0F; // Duració POST_EXPLOSION (espera final)
|
|
static constexpr float DELAY_ENTRE_EXPLOSIONS = 0.1F; // Temps entre explosions de lletres
|
|
static constexpr float VELOCITAT_EXPLOSIO = 240.0F; // Velocidad base fragments (px/s)
|
|
static constexpr float ESCALA_INICIAL = 0.1F; // Escala inicial (10%)
|
|
static constexpr float ESCALA_FINAL = 0.8F; // Escala final (80%)
|
|
static constexpr float ESPAI_ENTRE_LLETRES = 10.0F; // Espaiat entre lletres
|
|
|
|
// Constants de animación seqüencial
|
|
static constexpr float THRESHOLD_LETRA = 0.6F; // Umbral per activar següent lletra (0.0-1.0)
|
|
static constexpr float ORIGEN_ZOOM_X = Defaults::Game::WIDTH * 0.5F; // Vec2 inicial X del zoom
|
|
static constexpr float ORIGEN_ZOOM_Y = Defaults::Game::HEIGHT * 0.4F; // Vec2 inicial Y del zoom
|
|
|
|
// Métodos privats
|
|
void inicialitzar_lletres();
|
|
void actualitzar_explosions(float delta_time);
|
|
auto checkSkipButtonPressed() -> bool;
|
|
|
|
// Métodos de gestió de estats
|
|
void canviar_estat(AnimationState nou_estat);
|
|
[[nodiscard]] auto totes_lletres_completes() const -> bool;
|
|
};
|