From 0fe371653aa33d6b39dcb5cdcea8d6d423b34c0c Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Mon, 28 Oct 2024 13:51:26 +0100 Subject: [PATCH] commit de me ane cap a casa --- source/game.cpp | 10 ++++---- source/game.h | 2 +- source/path_sprite.cpp | 44 +++++++++++++++++++++++------------ source/path_sprite.h | 52 +++++++++++++++++++++++++++--------------- 4 files changed, 67 insertions(+), 41 deletions(-) diff --git a/source/game.cpp b/source/game.cpp index db0b29a..c822f8a 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -919,7 +919,7 @@ void Game::createItemScoreSprite(int x, int y, std::shared_ptr texture) } // Crea un objeto PathSprite -void Game::createPathSprite(SDL_Point start, SDL_Point end, std::shared_ptr texture) +void Game::createPathSprite(std::shared_ptr texture) { path_sprites_.emplace_back(std::make_unique(texture)); @@ -930,7 +930,6 @@ void Game::createPathSprite(SDL_Point start, SDL_Point end, std::shared_ptrsetWidth(w); path_sprites_.back()->setHeight(h); path_sprites_.back()->setSpriteClip({0, 0, w, h}); - path_sprites_.back()->addVerticalPath(start, end, 50, 10); path_sprites_.back()->enable(); } @@ -1579,10 +1578,9 @@ void Game::checkEvents() case SDLK_5: // Crea un PathSprite { const auto x = players_.at(0)->getPosX(); - const SDL_Point start = {x, 200}; - const SDL_Point end = {x, 170}; - createPathSprite(start, end, game_text_textures_.at(3)); - path_sprites_.back()->addVerticalPath({x,170}, {x,0}, 100, 1); + createPathSprite(game_text_textures_.at(3)); + path_sprites_.back()->addVerticalPath({x,220}, {x,170}, 100, 5); + path_sprites_.back()->addVerticalPath({x,170}, {x,-20}, 120, 5); break; } default: diff --git a/source/game.h b/source/game.h index 37af78b..c174707 100644 --- a/source/game.h +++ b/source/game.h @@ -308,7 +308,7 @@ private: void createItemScoreSprite(int x, int y, std::shared_ptr texture); // Crea un objeto PathSprite - void createPathSprite(SDL_Point x, SDL_Point y, std::shared_ptr texture); + void createPathSprite(std::shared_ptr texture); // Vacia el vector de smartsprites void freeSmartSprites(); diff --git a/source/path_sprite.cpp b/source/path_sprite.cpp index 7b21017..04b5687 100644 --- a/source/path_sprite.cpp +++ b/source/path_sprite.cpp @@ -16,34 +16,46 @@ void PathSprite::update() } } -// Añade un path vertical +// Añade un recorrido vertical void PathSprite::addVerticalPath(SDL_Point start, SDL_Point end, int steps, int waiting_counter) { paths_.emplace_back(createVerticalPath(start, end, steps), waiting_counter); } -// Añade un path horizontal +// Añade un recorrido horizontal void PathSprite::addHorizontalPath(SDL_Point start, SDL_Point end, int steps, int waiting_counter) { paths_.emplace_back(createHorizontalPath(start, end, steps), waiting_counter); } -// Devuelve un vector con los puntos que conforman la ruta -std::vector PathSprite::createVerticalPath(SDL_Point start, SDL_Point end, int steps) +// Añade un recorrido desde un vector +void PathSprite::addPath(std::vector spots, int waiting_counter) { - std::vector v; - v.reserve(steps); - - for (int i = 0; i < steps; ++i) - { - double t = static_cast(i) / steps; - double value = static_cast(start.y) + (end.y - start.y) * easeOutQuint(t); - v.emplace_back(SDL_Point{start.x, static_cast(value)}); - } - - return v; + paths_.emplace_back(spots, waiting_counter); } +std::vector PathSprite::createVerticalPath(const SDL_Point& start, const SDL_Point& end, int steps) { + std::vector v; + v.reserve(steps); + + for (int i = 0; i < steps; ++i) { + double t = static_cast(i) / steps; + double value = start.y + (end.y - start.y) * easeOutQuint(t); + + // Ajusta el valor si los puntos tienen signos diferentes + if (start.y > 0 && end.y < 0) { + value = start.y - std::abs(end.y - start.y) * easeOutQuint(t); + } else if (start.y < 0 && end.y > 0) { + value = start.y + std::abs(end.y - start.y) * easeOutQuint(t); + } + + v.emplace_back(SDL_Point{start.x, static_cast(value)}); + } + + return v; +} + + // Devuelve un vector con los puntos que conforman la ruta std::vector PathSprite::createHorizontalPath(SDL_Point start, SDL_Point end, int steps) { @@ -66,6 +78,7 @@ void PathSprite::enable() enabled_ = true; } +// Coloca el sprite en los diferentes puntos del recorrido void PathSprite::moveThroughCurrentPath() { auto &path = paths_.at(current_path_); @@ -92,6 +105,7 @@ void PathSprite::moveThroughCurrentPath() --path.waiting_counter; } +// Cambia de recorrido o finaliza void PathSprite::goToNextPathOrDie() { // Comprueba si ha terminado el recorrdo actual diff --git a/source/path_sprite.h b/source/path_sprite.h index d610bd1..f6a482b 100644 --- a/source/path_sprite.h +++ b/source/path_sprite.h @@ -4,23 +4,31 @@ #include "animated_sprite.h" // para SpriteAnimated class Texture; +enum class PathType +{ + VERTICAL, + HORIZONTAL, +}; + // Clase PathSprite class PathSprite : public AnimatedSprite { private: // Estructuras - struct Path - { - std::vector spots; // Puntos por los que se desplazará el sprite - int waiting_counter; // Tiempo de espera una vez en el destino - bool on_destination = false; // Indica si ha llegado al destino - bool finished = false; // Indica si ha terminado de esperarse - int counter = 0; // Contador interno +struct Path { + std::vector spots; // Puntos por los que se desplazará el sprite + int fixed_pos; // Coordenada fija + int waiting_counter; // Tiempo de espera una vez en el destino + bool on_destination = false; // Indica si ha llegado al destino + bool finished = false; // Indica si ha terminado de esperarse + int counter = 0; // Contador interno + PathType type; // Tipo de recorrido + + // Constructor + Path(const std::vector& spots_init, int waiting_counter_init, int fixed_pos_init, PathType type_init) + : spots(spots_init), waiting_counter(waiting_counter_init), fixed_pos(fixed_pos_init), type(type_init) {} +}; - // Constructor - Path(const std::vector &spots_init, int waiting_counter_init) - : spots(spots_init), waiting_counter(waiting_counter_init) {} - }; // Variables bool finished_ = false; // Indica si ya ha terminado @@ -28,13 +36,10 @@ private: int current_path_ = 0; // Path que se está recorriendo actualmente std::vector paths_; // Caminos a recorrer por el sprite - // Devuelve un vector con los puntos que conforman la ruta - std::vector createVerticalPath(SDL_Point start, SDL_Point end, int steps); - - // Devuelve un vector con los puntos que conforman la ruta - std::vector createHorizontalPath(SDL_Point start, SDL_Point end, int steps); - + // Coloca el sprite en los diferentes puntos del recorrido void moveThroughCurrentPath(); + + // Cambia de recorrido o finaliza void goToNextPathOrDie(); public: @@ -47,12 +52,21 @@ public: // Actualiza la posición del sprite void update() override; - // Añade un path vertical + // Añade un recorrido vertical void addVerticalPath(SDL_Point start, SDL_Point end, int steps, int waiting_counter); - // Añade un path horizontal + // Añade un recorrido horizontal void addHorizontalPath(SDL_Point start, SDL_Point end, int steps, int waiting_counter); + // Añade un recorrido desde un vector + void addPath(std::vector spots, int waiting_counter); + + // Devuelve un vector con los puntos que conforman la ruta + std::vector createVerticalPath(const SDL_Point &start, const SDL_Point &end, int steps); + + // Devuelve un vector con los puntos que conforman la ruta + std::vector createHorizontalPath(SDL_Point start, SDL_Point end, int steps); + // Habilita el objeto void enable();