Treballant en la intro

This commit is contained in:
2025-03-13 14:18:19 +01:00
parent a3d4b13f3b
commit 5a6b96f7ab
7 changed files with 126 additions and 50 deletions

View File

@@ -101,10 +101,10 @@ Espera un moment...
Si resulta que no tinc solt! Si resulta que no tinc solt!
## 34 - INTRO ## 34 - INTRO
MERDA DE MAQUINA! VAJA BIRRIA DE MAQUINA !!!
## 35 - INTRO ## 35 - INTRO
Blop... blop... blop... blop... blop... blop...
## 36 - TEXTOS DEL JUEGO ## 36 - TEXTOS DEL JUEGO
Temps detes: Temps detes:

View File

@@ -54,10 +54,8 @@ void Intro::updateScenes()
case 0: case 0:
{ {
// Primera imagen - UPV // Primera imagen - UPV
if (!sprites_.at(0)->hasFinished()) sprites_.at(0)->enable();
{ shadow_sprites_.at(0)->enable();
sprites_.at(0)->enable();
}
// Primer texto de la primera imagen // Primer texto de la primera imagen
if (sprites_.at(0)->hasFinished() && !texts_.at(0)->hasFinished()) if (sprites_.at(0)->hasFinished() && !texts_.at(0)->hasFinished())
@@ -92,10 +90,8 @@ void Intro::updateScenes()
case 1: case 1:
{ {
// Segunda imagen - Máquina // Segunda imagen - Máquina
if (!sprites_.at(1)->hasFinished()) sprites_.at(1)->enable();
{ shadow_sprites_.at(1)->enable();
sprites_.at(1)->enable();
}
// Primer texto de la segunda imagen // Primer texto de la segunda imagen
if (sprites_.at(1)->hasFinished() && !texts_.at(3)->hasFinished()) if (sprites_.at(1)->hasFinished() && !texts_.at(3)->hasFinished())
@@ -112,12 +108,15 @@ void Intro::updateScenes()
break; break;
} }
case 2: case 2:
{ {
// Tercera imagen junto con primer texto - GRITO // 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(); sprites_.at(2)->enable();
shadow_sprites_.at(2)->enable();
texts_.at(4)->setEnabled(true); texts_.at(4)->setEnabled(true);
} }
@@ -134,9 +133,11 @@ void Intro::updateScenes()
case 3: case 3:
{ {
// Cuarta imagen junto con primer texto - Reflexión // 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); texts_.at(5)->setEnabled(true);
} }
@@ -160,10 +161,8 @@ void Intro::updateScenes()
case 4: case 4:
{ {
// Quinta imagen - Patada // Quinta imagen - Patada
if (!sprites_.at(4)->hasFinished()) sprites_.at(4)->enable();
{ shadow_sprites_.at(4)->enable();
sprites_.at(4)->enable();
}
// Primer texto de la quinta imagen // Primer texto de la quinta imagen
if (sprites_.at(4)->hasFinished() && !texts_.at(7)->hasFinished()) if (sprites_.at(4)->hasFinished() && !texts_.at(7)->hasFinished())
@@ -184,9 +183,11 @@ void Intro::updateScenes()
case 5: case 5:
{ {
// Sexta imagen junto con texto - Globos de café // 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); texts_.at(8)->setEnabled(true);
} }
@@ -289,23 +290,25 @@ void Intro::initSprites()
sprite->setWidth(BITMAP_WIDTH); sprite->setWidth(BITMAP_WIDTH);
sprite->setHeight(BITMAP_HEIGHT); sprite->setHeight(BITMAP_HEIGHT);
sprite->setSpriteClip(0, 0, BITMAP_WIDTH, 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_.push_back(std::move(sprite));
} }
sprites_.at(0)->addPath(-BITMAP_WIDTH, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutQuint, 0); constexpr int BORDER = 4;
sprites_.at(1)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutQuint, 0); sprites_.at(0)->addPath(-BITMAP_WIDTH - BORDER, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeInOutExpo, 0);
sprites_.at(2)->addPath(-BITMAP_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 100, easeOutQuint, 0); sprites_.at(1)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutBounce, 0);
sprites_.at(3)->addPath(param.game.height, Y_DEST, PathType::VERTICAL, X_DEST, 100, easeOutQuint, 0); sprites_.at(2)->addPath(-BITMAP_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 40, easeOutQuint, 0);
sprites_.at(4)->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, 800, easeOutQuint, 0);
sprites_.at(5)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, 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 // 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<Texture>(Screen::get()->getRenderer()); auto shadow_texture = std::make_shared<Texture>(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); shadow_texture->setBlendMode(SDL_BLENDMODE_BLEND);
auto temp = SDL_GetRenderTarget(Screen::get()->getRenderer()); auto temp = SDL_GetRenderTarget(Screen::get()->getRenderer());
shadow_texture->setAsRenderTarget(Screen::get()->getRenderer()); shadow_texture->setAsRenderTarget(Screen::get()->getRenderer());
@@ -313,8 +316,22 @@ void Intro::initSprites()
SDL_RenderClear(Screen::get()->getRenderer()); SDL_RenderClear(Screen::get()->getRenderer());
SDL_SetRenderTarget(Screen::get()->getRenderer(), temp); SDL_SetRenderTarget(Screen::get()->getRenderer(), temp);
// Inicializa el sprite para la sombra // Inicializa los sprites para la sombra
shadow_sprite_ = std::make_unique<Sprite>(shadow_texture, sprites_.front()->getRect()); for (int i = 0; i < TOTAL_BITMAPS; ++i)
{
auto sprite = std::make_unique<PathSprite>(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 // Inicializa los textos
@@ -377,13 +394,15 @@ void Intro::initTexts()
// Actualiza los sprites // Actualiza los sprites
void Intro::updateSprites() 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 // Actualiza los textos
@@ -398,7 +417,7 @@ void Intro::updateTexts()
// Dibuja los sprites // Dibuja los sprites
void Intro::renderSprites() void Intro::renderSprites()
{ {
shadow_sprite_->render(); shadow_sprites_.at(scene_)->render();
sprites_.at(scene_)->render(); sprites_.at(scene_)->render();
} }

View File

@@ -19,9 +19,10 @@ class Intro
{ {
private: private:
// Objetos // 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>> sprites_; // Vector con los sprites inteligentes para los dibujos de la intro
std::vector<std::unique_ptr<Writer>> texts_; // Textos de la intro std::vector<std::unique_ptr<PathSprite>> shadow_sprites_; // Vector con los sprites inteligentes para las sombras
std::unique_ptr<Sprite> shadow_sprite_; // Sprite para la sombra de las imagenes std::vector<std::unique_ptr<Writer>> texts_; // Textos de la intro
std::unique_ptr<Sprite> shadow_sprite_; // Sprite para la sombra de las imagenes
// Variables // Variables
Uint32 ticks_ = 0; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks_ = 0; // Contador de ticks para ajustar la velocidad del programa

View File

@@ -39,13 +39,22 @@ std::vector<SDL_Point> createPath(int start, int end, PathType type, int fixed_p
// Actualiza la posición y comprueba si ha llegado a su destino // Actualiza la posición y comprueba si ha llegado a su destino
void PathSprite::update() void PathSprite::update()
{ {
if (enabled_) if (enabled_ && !has_finished_)
{ {
moveThroughCurrentPath(); moveThroughCurrentPath();
goToNextPathOrDie(); goToNextPathOrDie();
} }
} }
// Muestra el sprite por pantalla
void PathSprite::render()
{
if (enabled_)
{
Sprite::render();
}
}
// Añade un recorrido // Añade un recorrido
void PathSprite::addPath(Path path, bool centered) void PathSprite::addPath(Path path, bool centered)
{ {
@@ -151,12 +160,10 @@ void PathSprite::goToNextPathOrDie()
// Comprueba si quedan mas recorridos // Comprueba si quedan mas recorridos
if (current_path_ >= static_cast<int>(paths_.size())) if (current_path_ >= static_cast<int>(paths_.size()))
{ {
enabled_ = false; has_finished_ = true;
current_path_ = 0;
} }
} }
// Indica si ha terminado todos los recorridos // Indica si ha terminado todos los recorridos
bool PathSprite::hasFinished() bool PathSprite::hasFinished() { return has_finished_; }
{
return !enabled_;
}

View File

@@ -42,9 +42,10 @@ class PathSprite : public Sprite
{ {
private: private:
// Variables // Variables
bool enabled_ = false; // Indica si el objeto está habilitado bool enabled_ = false; // Indica si el objeto está habilitado
int current_path_ = 0; // Path que se está recorriendo actualmente bool has_finished_ = false; // Indica si el objeto ha finalizado el recorrido
std::vector<Path> paths_; // Caminos a recorrer por el sprite int current_path_ = 0; // Path que se está recorriendo actualmente
std::vector<Path> paths_; // Caminos a recorrer por el sprite
// Coloca el sprite en los diferentes puntos del recorrido // Coloca el sprite en los diferentes puntos del recorrido
void moveThroughCurrentPath(); void moveThroughCurrentPath();
@@ -63,6 +64,9 @@ public:
// Actualiza la posición del sprite // Actualiza la posición del sprite
void update(); void update();
// Muestra el sprite por pantalla
void render() override;
// Añade un recorrido // Añade un recorrido
void addPath(Path path, bool centered = false); void addPath(Path path, bool centered = false);
void addPath(std::vector<SDL_Point> spots, int waiting_counter = 0); void addPath(std::vector<SDL_Point> spots, int waiting_counter = 0);

View File

@@ -242,6 +242,48 @@ double easeInOut(double t)
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * 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 // Comprueba si una vector contiene una cadena
bool stringInVector(const std::vector<std::string> &vec, const std::string &str) bool stringInVector(const std::vector<std::string> &vec, const std::string &str)
{ {

View File

@@ -174,6 +174,9 @@ double easeInQuad(double t);
double easeOutQuad(double t); double easeOutQuad(double t);
double easeInOutSine(double t); double easeInOutSine(double t);
double easeInOut(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 // Comprueba si una vector contiene una cadena
bool stringInVector(const std::vector<std::string> &vec, const std::string &str); bool stringInVector(const std::vector<std::string> &vec, const std::string &str);