From bfd3943bbacc8f27ea67ce102bdd32712b833142 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Mon, 14 Jul 2025 19:20:28 +0200 Subject: [PATCH] Intro: les tarjetes ara tenen sombra Intro: colors configurables a param --- data/config/param_320x256.txt | 7 +- source/param.cpp | 10 +++ source/param.h | 1 + source/sections/intro.cpp | 144 +++++++++++++++++++++------------- source/sections/intro.h | 2 +- 5 files changed, 105 insertions(+), 59 deletions(-) diff --git a/data/config/param_320x256.txt b/data/config/param_320x256.txt index e0763f0..cbf193e 100644 --- a/data/config/param_320x256.txt +++ b/data/config/param_320x256.txt @@ -76,9 +76,10 @@ service_menu.bg_color 000F00F5 # Color de fondo del menú de servicio ( service_menu.drop_shadow false # ¿El menú de servicio tiene sombra? ## --- INTRO --- -intro.bg_color 543149 # Color de fondo de la intro -intro.bg_color 00FFFF # Color de fondo de la intro -intro.card_color CBDBFC # Color de las tarjetas en la intro +intro.bg_color 543149 # Color de fondo de la intro +intro.bg_color 00FFFF # Color de fondo de la intro +intro.card_color CBDBFC # Color de las tarjetas en la intro +intro.shadow_color 00000080 # Color de la sombra de las tarjetas en la intro ## --- DEBUG --- debug.color 00FFFF # Color para elementos de depuración diff --git a/source/param.cpp b/source/param.cpp index a9882a3..05f6767 100644 --- a/source/param.cpp +++ b/source/param.cpp @@ -78,6 +78,11 @@ void initParam() param.notification.pos_h = NotifyPosition::LEFT; param.notification.sound = false; param.notification.color = Color(48, 48, 48); + + // INTRO + param.intro.bg_color = Color::fromHex("543149"); + param.intro.card_color = Color::fromHex("CBDBFC"); + param.intro.shadow_color = Color::fromHex("00000080"); } // Carga los parámetros desde un archivo @@ -455,6 +460,11 @@ bool setParams(const std::string &var, const std::string &value) param.intro.card_color = Color::fromHex(value); } + else if (var == "intro.shadow_color") + { + param.intro.shadow_color = Color::fromHex(value); + } + // DEBUG else if (var == "debug.color") { diff --git a/source/param.h b/source/param.h index 605ced4..39c3336 100644 --- a/source/param.h +++ b/source/param.h @@ -106,6 +106,7 @@ struct ParamIntro { Color bg_color; Color card_color; + Color shadow_color; }; // --- Parámetros para Debug --- diff --git a/source/sections/intro.cpp b/source/sections/intro.cpp index 0a808e7..a16a753 100644 --- a/source/sections/intro.cpp +++ b/source/sections/intro.cpp @@ -68,11 +68,11 @@ void Intro::updateScenes() case 0: { // Primera imagen - UPV - sprites_.at(0)->enable(); + card_sprites_.at(0)->enable(); shadow_sprites_.at(0)->enable(); // Primer texto de la primera imagen - if (sprites_.at(0)->hasFinished() && !texts_.at(0)->hasFinished()) + if (card_sprites_.at(0)->hasFinished() && !texts_.at(0)->hasFinished()) { texts_.at(0)->setEnabled(true); } @@ -104,11 +104,11 @@ void Intro::updateScenes() case 1: { // Segunda imagen - Máquina - sprites_.at(1)->enable(); + card_sprites_.at(1)->enable(); shadow_sprites_.at(1)->enable(); // Primer texto de la segunda imagen - if (sprites_.at(1)->hasFinished() && !texts_.at(3)->hasFinished()) + if (card_sprites_.at(1)->hasFinished() && !texts_.at(3)->hasFinished()) { texts_.at(3)->setEnabled(true); } @@ -128,14 +128,14 @@ void Intro::updateScenes() // Tercera imagen junto con primer texto - GRITO if (!texts_.at(4)->hasFinished()) { - sprites_.at(2)->enable(); + card_sprites_.at(2)->enable(); shadow_sprites_.at(2)->enable(); texts_.at(4)->setEnabled(true); } // Fin de la tercera escena - if (sprites_.at(2)->hasFinished() && texts_.at(4)->hasFinished()) + if (card_sprites_.at(2)->hasFinished() && texts_.at(4)->hasFinished()) { texts_.at(4)->setEnabled(false); scene_++; @@ -147,7 +147,7 @@ void Intro::updateScenes() case 3: { // Cuarta imagen junto con primer texto - Reflexión - sprites_.at(3)->enable(); + card_sprites_.at(3)->enable(); shadow_sprites_.at(3)->enable(); if (!texts_.at(5)->hasFinished()) @@ -163,7 +163,7 @@ void Intro::updateScenes() } // Fin de la cuarta escena - if (sprites_.at(3)->hasFinished() && texts_.at(6)->hasFinished()) + if (card_sprites_.at(3)->hasFinished() && texts_.at(6)->hasFinished()) { texts_.at(6)->setEnabled(false); scene_++; @@ -175,7 +175,7 @@ void Intro::updateScenes() case 4: { // Quinta imagen - Patada - sprites_.at(4)->enable(); + card_sprites_.at(4)->enable(); shadow_sprites_.at(4)->enable(); // Primer texto de la quinta imagen @@ -185,7 +185,7 @@ void Intro::updateScenes() } // Fin de la quinta escena - if (sprites_.at(4)->hasFinished() && texts_.at(7)->hasFinished()) + if (card_sprites_.at(4)->hasFinished() && texts_.at(7)->hasFinished()) { texts_.at(7)->setEnabled(false); scene_++; @@ -197,7 +197,7 @@ void Intro::updateScenes() case 5: { // Sexta imagen junto con texto - Globos de café - sprites_.at(5)->enable(); + card_sprites_.at(5)->enable(); shadow_sprites_.at(5)->enable(); if (!texts_.at(8)->hasFinished()) @@ -212,7 +212,7 @@ void Intro::updateScenes() } // Acaba la ultima imagen - if (sprites_.at(5)->hasFinished() && texts_.at(8)->hasFinished()) + if (card_sprites_.at(5)->hasFinished() && texts_.at(8)->hasFinished()) { state_ = IntroState::POST; state_start_time_ = SDL_GetTicks(); @@ -309,51 +309,26 @@ void Intro::initSprites() "intro6.png"}; // Constantes + constexpr int TOTAL_SPRITES = TEXTURE_LIST.size(); + const float BORDER = 2.0f; + auto texture = Resource::get()->getTexture(TEXTURE_LIST.front()); - const float SPRITE_WIDTH = texture->getWidth(); - const float SPRITE_HEIGHT = texture->getHeight(); - const float X_DEST = param.game.game_area.center_x - SPRITE_WIDTH / 2; - const float Y_DEST = param.game.game_area.first_quarter_y - (SPRITE_HEIGHT / 4); + const float CARD_WIDTH = texture->getWidth() + (BORDER * 2); + const float CARD_HEIGHT = texture->getHeight() + (BORDER * 2); - // Inicializa los sprites con las imagenes - constexpr int TOTAL_SPRITES = 6; - for (int i = 0; i < TOTAL_SPRITES; ++i) - { - auto sprite = std::make_unique(Resource::get()->getTexture(TEXTURE_LIST.at(i))); - sprite->setWidth(SPRITE_WIDTH); - sprite->setHeight(SPRITE_HEIGHT); - sprite->setSpriteClip(0, 0, SPRITE_WIDTH, SPRITE_HEIGHT); - sprites_.push_back(std::move(sprite)); - } - - sprites_.at(0)->addPath(-SPRITE_WIDTH - 10, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeInOutExpo, 0); - sprites_.at(1)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutBounce, 0); - sprites_.at(2)->addPath(-SPRITE_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 40, easeOutQuint, 0); - sprites_.at(3)->addPath(param.game.height, Y_DEST, PathType::VERTICAL, X_DEST, 300, easeInOutExpo, 0); - sprites_.at(4)->addPath(-SPRITE_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 70, easeOutElastic, 0); - sprites_.at(5)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 250, easeOutQuad, 450); - sprites_.at(5)->addPath(X_DEST, -SPRITE_WIDTH, PathType::HORIZONTAL, Y_DEST, 80, easeInElastic, 0); - - // Constantes - const float BORDER = 4; - const float SHADOW_SPRITE_WIDTH = SPRITE_WIDTH + BORDER; - const float SHADOW_SPRITE_HEIGHT = SPRITE_HEIGHT + BORDER; - const float S_X_DEST = X_DEST - BORDER / 2; - const float S_Y_DEST = Y_DEST - BORDER / 2; - - // Crea las texturas para las imágenes traseras - std::vector> shadow_textures; + // Crea las texturas para las tarjetas + std::vector> card_textures; for (int i = 0; i < TOTAL_SPRITES; ++i) { // Crea la textura - auto shadow_texture = std::make_shared(Screen::get()->getRenderer()); - shadow_texture->createBlank(SHADOW_SPRITE_WIDTH, SHADOW_SPRITE_HEIGHT, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET); - shadow_texture->setBlendMode(SDL_BLENDMODE_BLEND); + auto card_texture = std::make_shared(Screen::get()->getRenderer()); + card_texture->createBlank(CARD_WIDTH, CARD_HEIGHT, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET); + card_texture->setBlendMode(SDL_BLENDMODE_BLEND); // Apuntamos el renderizador a la textura auto temp = SDL_GetRenderTarget(Screen::get()->getRenderer()); - shadow_texture->setAsRenderTarget(Screen::get()->getRenderer()); + card_texture->setAsRenderTarget(Screen::get()->getRenderer()); // Limpia la textura SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0, 0, 0, 0); @@ -362,26 +337,85 @@ void Intro::initSprites() // Pone color en el marco de la textura auto color = param.intro.card_color; SDL_SetRenderDrawColor(Screen::get()->getRenderer(), color.r, color.g, color.b, color.a); - SDL_FRect rect1 = {1, 0, SHADOW_SPRITE_WIDTH - 2, SHADOW_SPRITE_HEIGHT}; - SDL_FRect rect2 = {0, 1, SHADOW_SPRITE_WIDTH, SHADOW_SPRITE_HEIGHT - 2}; + SDL_FRect rect1 = {1, 0, CARD_WIDTH - 2, CARD_HEIGHT}; + SDL_FRect rect2 = {0, 1, CARD_WIDTH, CARD_HEIGHT - 2}; SDL_RenderRect(Screen::get()->getRenderer(), &rect1); SDL_RenderRect(Screen::get()->getRenderer(), &rect2); + // Copia la textura con la imagen dentro del marco + SDL_FRect dest = {BORDER, BORDER, CARD_WIDTH - (BORDER * 2), CARD_HEIGHT - (BORDER * 2)}; + SDL_RenderTexture(Screen::get()->getRenderer(), Resource::get()->getTexture(TEXTURE_LIST.at(i))->getSDLTexture(), nullptr, &dest); + // Deja el renderizador como estaba y añade la textura a la lista SDL_SetRenderTarget(Screen::get()->getRenderer(), temp); - shadow_textures.push_back(shadow_texture); + card_textures.push_back(card_texture); } - // Inicializa los sprites para la sombra + // Inicializa los sprites para las tarjetas for (int i = 0; i < TOTAL_SPRITES; ++i) { - auto sprite = std::make_unique(shadow_textures.at(i)); + auto sprite = std::make_unique(card_textures.at(i)); + sprite->setWidth(CARD_WIDTH); + sprite->setHeight(CARD_HEIGHT); + sprite->setSpriteClip(0, 0, CARD_WIDTH, CARD_HEIGHT); + card_sprites_.push_back(std::move(sprite)); + } + + const float X_DEST = param.game.game_area.center_x - CARD_WIDTH / 2; + const float Y_DEST = param.game.game_area.first_quarter_y - (CARD_HEIGHT / 4); + + card_sprites_.at(0)->addPath(-CARD_WIDTH - 10, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeInOutExpo, 0); + card_sprites_.at(1)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutBounce, 0); + card_sprites_.at(2)->addPath(-CARD_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 40, easeOutQuint, 0); + card_sprites_.at(3)->addPath(param.game.height, Y_DEST, PathType::VERTICAL, X_DEST, 300, easeInOutExpo, 0); + card_sprites_.at(4)->addPath(-CARD_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 70, easeOutElastic, 0); + card_sprites_.at(5)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 250, easeOutQuad, 450); + card_sprites_.at(5)->addPath(X_DEST, -CARD_WIDTH, PathType::HORIZONTAL, Y_DEST, 80, easeInElastic, 0); + + // Constantes + const float DESP = 8; + const float SHADOW_SPRITE_WIDTH = CARD_WIDTH; + const float SHADOW_SPRITE_HEIGHT = CARD_HEIGHT; + + // Crea la textura para las sombras de las tarjetas + auto shadow_texture = std::make_shared(Screen::get()->getRenderer()); + shadow_texture->createBlank(SHADOW_SPRITE_WIDTH, SHADOW_SPRITE_HEIGHT, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET); + shadow_texture->setBlendMode(SDL_BLENDMODE_BLEND); + + // Apuntamos el renderizador a la textura + auto temp = SDL_GetRenderTarget(Screen::get()->getRenderer()); + shadow_texture->setAsRenderTarget(Screen::get()->getRenderer()); + + // Limpia la textura + SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0, 0, 0, 0); + SDL_RenderClear(Screen::get()->getRenderer()); + + // Dibuja la sombra sobre la textura + auto color = param.intro.shadow_color; + SDL_SetRenderDrawColor(Screen::get()->getRenderer(), color.r, color.g, color.b, 255); + SDL_FRect rect1 = {1, 0, SHADOW_SPRITE_WIDTH - 2, SHADOW_SPRITE_HEIGHT}; + SDL_FRect rect2 = {0, 1, SHADOW_SPRITE_WIDTH, SHADOW_SPRITE_HEIGHT - 2}; + SDL_RenderFillRect(Screen::get()->getRenderer(), &rect1); + SDL_RenderFillRect(Screen::get()->getRenderer(), &rect2); + + // Deja el renderizador como estaba y añade la textura a la lista + SDL_SetRenderTarget(Screen::get()->getRenderer(), temp); + + // Inicializa los sprites para la sombras usando la texturas con la sombra + for (int i = 0; i < TOTAL_SPRITES; ++i) + { + auto color = param.intro.shadow_color; + auto sprite = std::make_unique(shadow_texture); sprite->setWidth(SHADOW_SPRITE_WIDTH); sprite->setHeight(SHADOW_SPRITE_HEIGHT); sprite->setSpriteClip(0, 0, SHADOW_SPRITE_WIDTH, SHADOW_SPRITE_HEIGHT); + sprite->getTexture()->setAlpha(color.a); shadow_sprites_.push_back(std::move(sprite)); } + const float S_X_DEST = X_DEST + DESP; + const float S_Y_DEST = Y_DEST + DESP; + shadow_sprites_.at(0)->addPath(param.game.height + 10, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 100, easeInOutExpo, 0); shadow_sprites_.at(1)->addPath(-SHADOW_SPRITE_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 100, easeOutBounce, 0); shadow_sprites_.at(2)->addPath(-SHADOW_SPRITE_WIDTH, S_X_DEST, PathType::HORIZONTAL, S_Y_DEST, 40, easeOutQuint, 0); @@ -451,7 +485,7 @@ void Intro::initTexts() // Actualiza los sprites void Intro::updateSprites() { - for (auto &sprite : sprites_) + for (auto &sprite : card_sprites_) { sprite->update(); } @@ -475,7 +509,7 @@ void Intro::updateTexts() void Intro::renderSprites() { shadow_sprites_.at(scene_)->render(); - sprites_.at(scene_)->render(); + card_sprites_.at(scene_)->render(); } // Dibuja los textos diff --git a/source/sections/intro.h b/source/sections/intro.h index 2b00a3e..d44cd16 100644 --- a/source/sections/intro.h +++ b/source/sections/intro.h @@ -41,7 +41,7 @@ private: }; // --- Objetos --- - std::vector> sprites_; // Vector con los sprites inteligentes para los dibujos de la intro + std::vector> card_sprites_; // Vector con los sprites inteligentes para los dibujos de la intro std::vector> shadow_sprites_; // Vector con los sprites inteligentes para las sombras std::vector> texts_; // Textos de la intro std::unique_ptr tiled_bg_; // Fondo en mosaico