Intro: les tarjetes ara tenen sombra

Intro: colors configurables a param
This commit is contained in:
2025-07-14 19:20:28 +02:00
parent d35032a42a
commit bfd3943bba
5 changed files with 105 additions and 59 deletions

View File

@@ -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

View File

@@ -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")
{

View File

@@ -106,6 +106,7 @@ struct ParamIntro
{
Color bg_color;
Color card_color;
Color shadow_color;
};
// --- Parámetros para Debug ---

View File

@@ -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<PathSprite>(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<std::shared_ptr<Texture>> shadow_textures;
// Crea las texturas para las tarjetas
std::vector<std::shared_ptr<Texture>> card_textures;
for (int i = 0; i < TOTAL_SPRITES; ++i)
{
// Crea la textura
auto shadow_texture = std::make_shared<Texture>(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<Texture>(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<PathSprite>(shadow_textures.at(i));
auto sprite = std::make_unique<PathSprite>(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<Texture>(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<PathSprite>(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

View File

@@ -41,7 +41,7 @@ private:
};
// --- Objetos ---
std::vector<std::unique_ptr<PathSprite>> sprites_; // Vector con los sprites inteligentes para los dibujos de la intro
std::vector<std::unique_ptr<PathSprite>> card_sprites_; // Vector con los sprites inteligentes para los dibujos de la intro
std::vector<std::unique_ptr<PathSprite>> shadow_sprites_; // Vector con los sprites inteligentes para las sombras
std::vector<std::unique_ptr<Writer>> texts_; // Textos de la intro
std::unique_ptr<TiledBG> tiled_bg_; // Fondo en mosaico