From c61299f17f29a5aa61fdefdf09d350c7da255772 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 22 May 2026 13:04:11 +0200 Subject: [PATCH] =?UTF-8?q?feat(title):=20paleta=20neon=20synthwave=20per?= =?UTF-8?q?=20element=20a=20l'escena=20de=20t=C3=ADtol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/core/defaults/title.hpp | 16 ++++++++++++++++ source/core/graphics/starfield.cpp | 6 +++++- source/core/graphics/starfield.hpp | 4 ++++ source/game/scenes/title_scene.cpp | 15 ++++++++------- source/game/title/ship_animator.cpp | 9 +++++++-- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/source/core/defaults/title.hpp b/source/core/defaults/title.hpp index cf2922b..aa5d851 100644 --- a/source/core/defaults/title.hpp +++ b/source/core/defaults/title.hpp @@ -3,6 +3,8 @@ #pragma once +#include + #include #include "core/defaults/game.hpp" @@ -126,4 +128,18 @@ namespace Defaults::Title { constexpr float TEXT_SPACING = 2.0F; } // namespace Layout + // Paleta neon de l'escena de títol (cian + magenta synthwave). + // alpha = 255 (sentinela "color vàlid") fa que el pipeline ignori + // el color global de l'oscil·lador per a aquesta crida. + namespace Colors { + constexpr SDL_Color LOGO_MAIN = {.r = 80, .g = 240, .b = 255, .a = 255}; // Cian elèctric + constexpr SDL_Color LOGO_SHADOW = {.r = 255, .g = 60, .b = 180, .a = 255}; // Magenta neon (offset) + constexpr SDL_Color SHIP_P1 = {.r = 255, .g = 100, .b = 200, .a = 255}; // Rosa hot + constexpr SDL_Color SHIP_P2 = {.r = 160, .g = 120, .b = 255, .a = 255}; // Violeta elèctric + constexpr SDL_Color STARFIELD = {.r = 200, .g = 220, .b = 255, .a = 255}; // Blanc-blau gel + constexpr SDL_Color PRESS_START = {.r = 255, .g = 200, .b = 70, .a = 255}; // Ambre neon + constexpr SDL_Color JAILGAMES_LOGO = {.r = 120, .g = 220, .b = 200, .a = 255}; // Teal suau + constexpr SDL_Color COPYRIGHT = {.r = 140, .g = 180, .b = 200, .a = 255}; // Gris-cian apagat + } // namespace Colors + } // namespace Defaults::Title diff --git a/source/core/graphics/starfield.cpp b/source/core/graphics/starfield.cpp index b6babe2..3e09ff8 100644 --- a/source/core/graphics/starfield.cpp +++ b/source/core/graphics/starfield.cpp @@ -94,7 +94,7 @@ namespace Graphics { .rotation_euler = Vec3{.x = star.rot_phase_x, .y = star.rot_phase_y, .z = 0.0F}, .scale = star.scale, }; - drawWireframe(renderer_, *camera_, octahedron_, TRANSFORM, computeBrightness(star)); + drawWireframe(renderer_, *camera_, octahedron_, TRANSFORM, computeBrightness(star), color_); } } @@ -102,4 +102,8 @@ namespace Graphics { brightness_mult_ = std::max(0.0F, multiplier); } + void Starfield::setColor(SDL_Color color) { + color_ = color; + } + } // namespace Graphics diff --git a/source/core/graphics/starfield.hpp b/source/core/graphics/starfield.hpp index 012ac7a..83e05a6 100644 --- a/source/core/graphics/starfield.hpp +++ b/source/core/graphics/starfield.hpp @@ -8,6 +8,8 @@ #pragma once +#include + #include #include "core/graphics/camera3d.hpp" @@ -25,6 +27,7 @@ namespace Graphics { void draw() const; void setBrightness(float multiplier); + void setColor(SDL_Color color); private: struct Star { @@ -45,6 +48,7 @@ namespace Graphics { std::vector stars_; Mesh3D octahedron_; float brightness_mult_{1.0F}; + SDL_Color color_{.r = 0, .g = 0, .b = 0, .a = 0}; // alpha=0 → usa color global // Volum de spawn / regeneració en l'espai 3D. static constexpr float Z_NEAR_RESPAWN = 5.0F; // Si Z < aquest valor → regenera diff --git a/source/game/scenes/title_scene.cpp b/source/game/scenes/title_scene.cpp index c3f90fa..9712f3e 100644 --- a/source/game/scenes/title_scene.cpp +++ b/source/game/scenes/title_scene.cpp @@ -59,6 +59,7 @@ TitleScene::TitleScene(SDLManager& sdl, SceneContext& context) sdl_.getRenderer(), camera_.get(), 200); + starfield_->setColor(Defaults::Title::Colors::STARFIELD); if (estat_actual_ == TitleState::MAIN) { starfield_->setBrightness(BRIGHTNESS_STARFIELD); } else { @@ -251,7 +252,7 @@ void TitleScene::inicialitzarJailgames() { void TitleScene::dibuixarPeuTitol(float spacing) const { for (const auto& lletra : lletres_jailgames_) { - Rendering::renderShape(sdl_.getRenderer(), lletra.shape, lletra.position, 0.0F, Defaults::Title::Layout::JAILGAMES_SCALE, 1.0F); + Rendering::renderShape(sdl_.getRenderer(), lletra.shape, lletra.position, 0.0F, Defaults::Title::Layout::JAILGAMES_SCALE, 1.0F, 1.0F, Defaults::Title::Colors::JAILGAMES_LOGO); } std::string copyright = Project::COPYRIGHT; for (char& c : copyright) { @@ -261,7 +262,7 @@ void TitleScene::dibuixarPeuTitol(float spacing) const { } const float Y_COPY = Defaults::Game::HEIGHT * Defaults::Title::Layout::COPYRIGHT1_POS; const float CENTRE_X = Defaults::Game::WIDTH / 2.0F; - text_.renderCentered(copyright, {.x = CENTRE_X, .y = Y_COPY}, Defaults::Title::Layout::COPYRIGHT_SCALE, spacing); + text_.renderCentered(copyright, {.x = CENTRE_X, .y = Y_COPY}, Defaults::Title::Layout::COPYRIGHT_SCALE, spacing, 1.0F, Defaults::Title::Colors::COPYRIGHT); } auto TitleScene::isFinished() const -> bool { @@ -476,22 +477,22 @@ void TitleScene::draw() { .x = posicions_originals_orni_[i].x + std::round(SHADOW_OX), .y = posicions_originals_orni_[i].y + std::round(SHADOW_OY), }; - Rendering::renderShape(sdl_.getRenderer(), lletres_orni_[i].shape, POS_SHADOW, 0.0F, Defaults::Title::Layout::LOGO_SCALE, 1.0F, SHADOW_BRIGHTNESS); + Rendering::renderShape(sdl_.getRenderer(), lletres_orni_[i].shape, POS_SHADOW, 0.0F, Defaults::Title::Layout::LOGO_SCALE, 1.0F, SHADOW_BRIGHTNESS, Defaults::Title::Colors::LOGO_SHADOW); } for (std::size_t i = 0; i < lletres_attack_.size(); ++i) { const Vec2 POS_SHADOW{ .x = posicions_originals_attack_[i].x + std::round(SHADOW_OX), .y = posicions_originals_attack_[i].y + std::round(SHADOW_OY), }; - Rendering::renderShape(sdl_.getRenderer(), lletres_attack_[i].shape, POS_SHADOW, 0.0F, Defaults::Title::Layout::LOGO_SCALE, 1.0F, SHADOW_BRIGHTNESS); + Rendering::renderShape(sdl_.getRenderer(), lletres_attack_[i].shape, POS_SHADOW, 0.0F, Defaults::Title::Layout::LOGO_SCALE, 1.0F, SHADOW_BRIGHTNESS, Defaults::Title::Colors::LOGO_SHADOW); } } for (const auto& lletra : lletres_orni_) { - Rendering::renderShape(sdl_.getRenderer(), lletra.shape, lletra.position, 0.0F, Defaults::Title::Layout::LOGO_SCALE, 1.0F); + Rendering::renderShape(sdl_.getRenderer(), lletra.shape, lletra.position, 0.0F, Defaults::Title::Layout::LOGO_SCALE, 1.0F, 1.0F, Defaults::Title::Colors::LOGO_MAIN); } for (const auto& lletra : lletres_attack_) { - Rendering::renderShape(sdl_.getRenderer(), lletra.shape, lletra.position, 0.0F, Defaults::Title::Layout::LOGO_SCALE, 1.0F); + Rendering::renderShape(sdl_.getRenderer(), lletra.shape, lletra.position, 0.0F, Defaults::Title::Layout::LOGO_SCALE, 1.0F, 1.0F, Defaults::Title::Colors::LOGO_MAIN); } const float SPACING = Defaults::Title::Layout::TEXT_SPACING; @@ -506,7 +507,7 @@ void TitleScene::draw() { const float MAIN_SCALE = Defaults::Title::Layout::PRESS_START_SCALE; const float CENTRE_X = Defaults::Game::WIDTH / 2.0F; const float CENTRE_Y = Defaults::Game::HEIGHT * Defaults::Title::Layout::PRESS_START_POS; - text_.renderCentered(MAIN_TEXT, {.x = CENTRE_X, .y = CENTRE_Y}, MAIN_SCALE, SPACING); + text_.renderCentered(MAIN_TEXT, {.x = CENTRE_X, .y = CENTRE_Y}, MAIN_SCALE, SPACING, 1.0F, Defaults::Title::Colors::PRESS_START); } dibuixarPeuTitol(SPACING); diff --git a/source/game/title/ship_animator.cpp b/source/game/title/ship_animator.cpp index cd66d99..5a02ab2 100644 --- a/source/game/title/ship_animator.cpp +++ b/source/game/title/ship_animator.cpp @@ -5,6 +5,7 @@ #include #include +#include #include "core/defaults.hpp" #include "core/graphics/shape_loader.hpp" @@ -150,7 +151,8 @@ namespace Title { if (camera_ == nullptr || renderer_ == nullptr) { return; } - for (const auto& ship : ships_) { + for (std::size_t i = 0; i < ships_.size(); ++i) { + const auto& ship = ships_[i]; if (!ship.visible) { continue; } @@ -160,7 +162,10 @@ namespace Title { .rotation_euler = Vec3{.x = EULER.x, .y = EULER.y, .z = 0.0F}, .scale = ship.current_scale, }; - Graphics::drawWireframe(renderer_, *camera_, ship.mesh, TRANSFORM, 1.0F); + const SDL_Color SHIP_COLOR = (i == 0) + ? Defaults::Title::Colors::SHIP_P1 + : Defaults::Title::Colors::SHIP_P2; + Graphics::drawWireframe(renderer_, *camera_, ship.mesh, TRANSFORM, 1.0F, SHIP_COLOR); } }