Files
orni-attack/source/game/systems/init_hud_animator.hpp
T

80 lines
3.5 KiB
C++

// init_hud_animator.hpp - Animación inicial del HUD del juego
// © 2026 JailDesigner
//
// Cubre la animación INIT_HUD del comienzo de cada partida/stage:
// 1. Crecimiento de los marcos del PLAYAREA con efecto pincel en 3 fases.
// 2. Marcador subiendo desde abajo.
// 3. Naves entrando desde la zone inferior hacia su spawn.
//
// Todas las funciones son puras (sin estado interno propio). GameScene aporta
// el contexto que necesitan: posiciones finales, texto del scoreboard y el
// renderer/VectorText. El timing global (progress 0..1) lo gestiona
// StageManager.
#pragma once
#include <memory>
#include <string>
#include "core/graphics/shape.hpp"
#include "core/graphics/vector_text.hpp"
#include "core/rendering/render_context.hpp"
#include "core/types.hpp"
namespace Systems::InitHud {
// Dades del marcador. El render reparteix tres blocs ancorats: bloc P1 a
// l'esquerra i bloc P2 a la dreta (mateix ordre intern "punts vides", no
// mirrored), i el nivell centrat. Cada bloc de jugador es pinta amb el seu
// color (vegeu Defaults::Hud::Colors); el nivell, en verd de sistema.
struct ScoreboardData {
std::string score_p1; // 6 dígits, zeros a l'esquerra
std::string score_p2; // 6 dígits, zeros a l'esquerra
int lives_p1{0}; // vides P1 (icones de nau al render)
int lives_p2{0}; // vides P2
std::string level_label; // ex: "NIVELL "
std::string level_value; // ex: "01"
// Shapes de les naus per dibuixar les vides com a icones en miniatura.
std::shared_ptr<Graphics::Shape> shape_p1;
std::shared_ptr<Graphics::Shape> shape_p2;
};
// Convierte un progreso global 0..1 al sub-progreso de un elemento que solo
// se anima en la ventana [ratio_init, ratio_end].
// < ratio_init → 0.0 (no empezó)
// > ratio_end → 1.0 (terminó)
// en rango → interpolación lineal 0..1
[[nodiscard]] auto computeRangeProgress(float global_progress,
float ratio_init,
float ratio_end) -> float;
// Calcula posición Y animada de una nave durante INIT_HUD. La nave sube
// desde 50 px bajo el PLAYAREA hasta `final_position` con easing.
[[nodiscard]] auto computeShipPosition(float progress, const Vec2& final_position) -> Vec2;
// Dibuja los 4 lados del PLAYAREA con efecto pincel en 3 fases:
// 0..33% → línea superior crece desde el centro hacia los lados.
// 33..66% → líneas verticales bajan por los laterales.
// 66..100% → línea inferior crece desde los lados hacia el centro.
void drawBordersAnimated(Rendering::Renderer* renderer, float progress);
// Dibuixa el marcador en tres blocs ancorats a la fila d'alçada `center_y`:
// bloc P1 a l'esquerra, bloc P2 a la dreta i nivell centrat. Cada bloc amb
// el seu color (Defaults::Hud::Colors). El renderer cal per dibuixar les
// icones de vides (shapes de nau).
void drawScoreboardAt(Rendering::Renderer* renderer,
const Graphics::VectorText& text,
const ScoreboardData& data,
float center_y,
float scale,
float spacing);
// Dibuixa el marcador pujant des de fora de la pantalla fins a la seva
// posició final amb easing. Delega a drawScoreboardAt.
void drawScoreboardAnimated(Rendering::Renderer* renderer,
const Graphics::VectorText& text,
const ScoreboardData& data,
float progress);
} // namespace Systems::InitHud