From 5a6b96f7abd55f1ed32848114b22aa594db7dc80 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 13 Mar 2025 14:18:19 +0100 Subject: [PATCH] Treballant en la intro --- data/lang/ba_BA.txt | 4 +- source/intro.cpp | 91 +++++++++++++++++++++++++----------------- source/intro.h | 7 ++-- source/path_sprite.cpp | 19 ++++++--- source/path_sprite.h | 10 +++-- source/utils.cpp | 42 +++++++++++++++++++ source/utils.h | 3 ++ 7 files changed, 126 insertions(+), 50 deletions(-) diff --git a/data/lang/ba_BA.txt b/data/lang/ba_BA.txt index 354eb26..aafa1ec 100644 --- a/data/lang/ba_BA.txt +++ b/data/lang/ba_BA.txt @@ -101,10 +101,10 @@ Espera un moment... Si resulta que no tinc solt! ## 34 - INTRO -MERDA DE MAQUINA! +VAJA BIRRIA DE MAQUINA !!! ## 35 - INTRO -Blop... blop... blop... +blop... blop... blop... ## 36 - TEXTOS DEL JUEGO Temps detes: diff --git a/source/intro.cpp b/source/intro.cpp index 54d38e8..0b72a3a 100644 --- a/source/intro.cpp +++ b/source/intro.cpp @@ -54,10 +54,8 @@ void Intro::updateScenes() case 0: { // Primera imagen - UPV - if (!sprites_.at(0)->hasFinished()) - { - sprites_.at(0)->enable(); - } + sprites_.at(0)->enable(); + shadow_sprites_.at(0)->enable(); // Primer texto de la primera imagen if (sprites_.at(0)->hasFinished() && !texts_.at(0)->hasFinished()) @@ -92,10 +90,8 @@ void Intro::updateScenes() case 1: { // Segunda imagen - Máquina - if (!sprites_.at(1)->hasFinished()) - { - sprites_.at(1)->enable(); - } + sprites_.at(1)->enable(); + shadow_sprites_.at(1)->enable(); // Primer texto de la segunda imagen if (sprites_.at(1)->hasFinished() && !texts_.at(3)->hasFinished()) @@ -112,12 +108,15 @@ void Intro::updateScenes() break; } + case 2: { // Tercera imagen junto con primer texto - GRITO - if (!sprites_.at(2)->hasFinished() && !texts_.at(4)->hasFinished()) + if (!texts_.at(4)->hasFinished()) { sprites_.at(2)->enable(); + shadow_sprites_.at(2)->enable(); + texts_.at(4)->setEnabled(true); } @@ -134,9 +133,11 @@ void Intro::updateScenes() case 3: { // Cuarta imagen junto con primer texto - Reflexión - if (!sprites_.at(3)->hasFinished() && !texts_.at(5)->hasFinished()) + sprites_.at(3)->enable(); + shadow_sprites_.at(3)->enable(); + + if (!texts_.at(5)->hasFinished()) { - sprites_.at(3)->enable(); texts_.at(5)->setEnabled(true); } @@ -160,10 +161,8 @@ void Intro::updateScenes() case 4: { // Quinta imagen - Patada - if (!sprites_.at(4)->hasFinished()) - { - sprites_.at(4)->enable(); - } + sprites_.at(4)->enable(); + shadow_sprites_.at(4)->enable(); // Primer texto de la quinta imagen if (sprites_.at(4)->hasFinished() && !texts_.at(7)->hasFinished()) @@ -184,9 +183,11 @@ void Intro::updateScenes() case 5: { // Sexta imagen junto con texto - Globos de café - if (!sprites_.at(5)->hasFinished() && !texts_.at(8)->hasFinished()) + sprites_.at(5)->enable(); + shadow_sprites_.at(5)->enable(); + + if (!texts_.at(8)->hasFinished()) { - sprites_.at(5)->enable(); texts_.at(8)->setEnabled(true); } @@ -289,23 +290,25 @@ void Intro::initSprites() sprite->setWidth(BITMAP_WIDTH); sprite->setHeight(BITMAP_HEIGHT); sprite->setSpriteClip(0, 0, BITMAP_WIDTH, BITMAP_HEIGHT); - - // sprite->setFinishedCounter(20); - // sprite->setDestX(param.game.game_area.center_x - (BITMAP_WIDTH / 2)); - // sprite->setDestY(param.game.game_area.first_quarter_y - (BITMAP_HEIGHT / 4)); sprites_.push_back(std::move(sprite)); } - sprites_.at(0)->addPath(-BITMAP_WIDTH, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutQuint, 0); - sprites_.at(1)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutQuint, 0); - sprites_.at(2)->addPath(-BITMAP_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 100, easeOutQuint, 0); - sprites_.at(3)->addPath(param.game.height, Y_DEST, PathType::VERTICAL, X_DEST, 100, easeOutQuint, 0); - sprites_.at(4)->addPath(-BITMAP_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 100, easeOutQuint, 0); - sprites_.at(5)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutQuint, 0); + constexpr int BORDER = 4; + sprites_.at(0)->addPath(-BITMAP_WIDTH - BORDER, 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(-BITMAP_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 40, easeOutQuint, 0); + sprites_.at(3)->addPath(param.game.height, Y_DEST, PathType::VERTICAL, X_DEST, 800, easeOutQuint, 0); + sprites_.at(4)->addPath(-BITMAP_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 70, easeOutElastic, 0); + sprites_.at(5)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 400, easeOutQuint, 0); // Crea la textura para la sombra + const int S_BITMAP_WIDTH = BITMAP_WIDTH + BORDER; + const int S_BITMAP_HEIGHT = BITMAP_HEIGHT + BORDER; + const int S_X_DEST = X_DEST - BORDER / 2; + const int S_Y_DEST = Y_DEST - BORDER / 2;; + auto shadow_texture = std::make_shared(Screen::get()->getRenderer()); - shadow_texture->createBlank(BITMAP_WIDTH, BITMAP_HEIGHT, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET); + shadow_texture->createBlank(S_BITMAP_WIDTH, S_BITMAP_HEIGHT, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET); shadow_texture->setBlendMode(SDL_BLENDMODE_BLEND); auto temp = SDL_GetRenderTarget(Screen::get()->getRenderer()); shadow_texture->setAsRenderTarget(Screen::get()->getRenderer()); @@ -313,8 +316,22 @@ void Intro::initSprites() SDL_RenderClear(Screen::get()->getRenderer()); SDL_SetRenderTarget(Screen::get()->getRenderer(), temp); - // Inicializa el sprite para la sombra - shadow_sprite_ = std::make_unique(shadow_texture, sprites_.front()->getRect()); + // Inicializa los sprites para la sombra + for (int i = 0; i < TOTAL_BITMAPS; ++i) + { + auto sprite = std::make_unique(shadow_texture); + sprite->setWidth(S_BITMAP_WIDTH); + sprite->setHeight(S_BITMAP_HEIGHT); + sprite->setSpriteClip(0, 0, S_BITMAP_WIDTH, S_BITMAP_HEIGHT); + shadow_sprites_.push_back(std::move(sprite)); + } + + shadow_sprites_.at(0)->addPath(param.game.height, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 100, easeInOutExpo, 0); + shadow_sprites_.at(1)->addPath(-S_BITMAP_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 100, easeOutBounce, 0); + shadow_sprites_.at(2)->addPath(-S_BITMAP_WIDTH, S_X_DEST, PathType::HORIZONTAL, S_Y_DEST, 40, easeOutQuint, 0); + shadow_sprites_.at(3)->addPath(param.game.width, S_X_DEST, PathType::HORIZONTAL, S_Y_DEST, 800, easeOutQuint, 0); + shadow_sprites_.at(4)->addPath(param.game.height, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 70, easeOutElastic, 0); + shadow_sprites_.at(5)->addPath(-S_BITMAP_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 400, easeOutQuint, 0); } // Inicializa los textos @@ -377,13 +394,15 @@ void Intro::initTexts() // Actualiza los sprites void Intro::updateSprites() { - for (auto &bitmap : sprites_) + for (auto &sprite : sprites_) { - bitmap->update(); + sprite->update(); + } + + for (auto &sprite : shadow_sprites_) + { + sprite->update(); } - const int X = sprites_.at(scene_)->getX() + 2; - const int Y = sprites_.at(scene_)->getY() + 2; - shadow_sprite_->setPosition(X, Y); } // Actualiza los textos @@ -398,7 +417,7 @@ void Intro::updateTexts() // Dibuja los sprites void Intro::renderSprites() { - shadow_sprite_->render(); + shadow_sprites_.at(scene_)->render(); sprites_.at(scene_)->render(); } diff --git a/source/intro.h b/source/intro.h index 3696501..d631223 100644 --- a/source/intro.h +++ b/source/intro.h @@ -19,9 +19,10 @@ class Intro { private: // Objetos - std::vector> sprites_; // Vector con los sprites inteligentes para los dibujos de la intro - std::vector> texts_; // Textos de la intro - std::unique_ptr shadow_sprite_; // Sprite para la sombra de las imagenes + std::vector> 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 shadow_sprite_; // Sprite para la sombra de las imagenes // Variables Uint32 ticks_ = 0; // Contador de ticks para ajustar la velocidad del programa diff --git a/source/path_sprite.cpp b/source/path_sprite.cpp index f3093ca..d395cfe 100644 --- a/source/path_sprite.cpp +++ b/source/path_sprite.cpp @@ -39,13 +39,22 @@ std::vector createPath(int start, int end, PathType type, int fixed_p // Actualiza la posición y comprueba si ha llegado a su destino void PathSprite::update() { - if (enabled_) + if (enabled_ && !has_finished_) { moveThroughCurrentPath(); goToNextPathOrDie(); } } +// Muestra el sprite por pantalla +void PathSprite::render() +{ + if (enabled_) + { + Sprite::render(); + } +} + // Añade un recorrido void PathSprite::addPath(Path path, bool centered) { @@ -151,12 +160,10 @@ void PathSprite::goToNextPathOrDie() // Comprueba si quedan mas recorridos if (current_path_ >= static_cast(paths_.size())) { - enabled_ = false; + has_finished_ = true; + current_path_ = 0; } } // Indica si ha terminado todos los recorridos -bool PathSprite::hasFinished() -{ - return !enabled_; -} \ No newline at end of file +bool PathSprite::hasFinished() { return has_finished_; } \ No newline at end of file diff --git a/source/path_sprite.h b/source/path_sprite.h index bb35b32..00f9a9a 100644 --- a/source/path_sprite.h +++ b/source/path_sprite.h @@ -42,9 +42,10 @@ class PathSprite : public Sprite { private: // Variables - bool enabled_ = false; // Indica si el objeto está habilitado - int current_path_ = 0; // Path que se está recorriendo actualmente - std::vector paths_; // Caminos a recorrer por el sprite + bool enabled_ = false; // Indica si el objeto está habilitado + bool has_finished_ = false; // Indica si el objeto ha finalizado el recorrido + int current_path_ = 0; // Path que se está recorriendo actualmente + std::vector paths_; // Caminos a recorrer por el sprite // Coloca el sprite en los diferentes puntos del recorrido void moveThroughCurrentPath(); @@ -63,6 +64,9 @@ public: // Actualiza la posición del sprite void update(); + // Muestra el sprite por pantalla + void render() override; + // Añade un recorrido void addPath(Path path, bool centered = false); void addPath(std::vector spots, int waiting_counter = 0); diff --git a/source/utils.cpp b/source/utils.cpp index f2e0e24..36a8a61 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -242,6 +242,48 @@ double easeInOut(double t) return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; } +// Función de suavizado +double easeInOutExpo(double t) +{ + return t == 0 ? 0 : (t == 1 ? 1 : (t < 0.5 ? pow(2, 20 * t - 10) / 2 : (2 - pow(2, -20 * t + 10)) / 2)); +} + +// Función de suavizado +double easeOutBounce(double t) +{ + if (t < 1 / 2.75) + { + return 7.5625 * t * t; + } + else if (t < 2 / 2.75) + { + t -= 1.5 / 2.75; + return 7.5625 * t * t + 0.75; + } + else if (t < 2.5 / 2.75) + { + t -= 2.25 / 2.75; + return 7.5625 * t * t + 0.9375; + } + else + { + t -= 2.625 / 2.75; + return 7.5625 * t * t + 0.984375; + } +} + +// Función de suavizado +double easeOutElastic(double t) +{ + const double c4 = (2 * M_PI) / 3; // Constante para controlar la elasticidad + + return t == 0 + ? 0 + : (t == 1 + ? 1 + : pow(2, -10 * t) * sin((t * 10 - 0.75) * c4) + 1); +} + // Comprueba si una vector contiene una cadena bool stringInVector(const std::vector &vec, const std::string &str) { diff --git a/source/utils.h b/source/utils.h index 5c8a90a..7d3523a 100644 --- a/source/utils.h +++ b/source/utils.h @@ -174,6 +174,9 @@ double easeInQuad(double t); double easeOutQuad(double t); double easeInOutSine(double t); double easeInOut(double t); +double easeInOutExpo(double t); +double easeOutBounce(double t); +double easeOutElastic(double t); // Comprueba si una vector contiene una cadena bool stringInVector(const std::vector &vec, const std::string &str);