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!
## 34 - INTRO
MERDA DE MAQUINA!
VAJA BIRRIA DE MAQUINA !!!
## 35 - INTRO
Blop... blop... blop...
blop... blop... blop...
## 36 - TEXTOS DEL JUEGO
Temps detes:

View File

@@ -54,10 +54,8 @@ void Intro::updateScenes()
case 0:
{
// Primera imagen - UPV
if (!sprites_.at(0)->hasFinished())
{
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();
}
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())
{
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();
}
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())
{
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<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);
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<Sprite>(shadow_texture, sprites_.front()->getRect());
// Inicializa los sprites para la sombra
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
@@ -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();
}

View File

@@ -20,6 +20,7 @@ class Intro
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>> shadow_sprites_; // Vector con los sprites inteligentes para las sombras
std::vector<std::unique_ptr<Writer>> texts_; // Textos de la intro
std::unique_ptr<Sprite> shadow_sprite_; // Sprite para la sombra de las imagenes

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
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<int>(paths_.size()))
{
enabled_ = false;
has_finished_ = true;
current_path_ = 0;
}
}
// Indica si ha terminado todos los recorridos
bool PathSprite::hasFinished()
{
return !enabled_;
}
bool PathSprite::hasFinished() { return has_finished_; }

View File

@@ -43,6 +43,7 @@ class PathSprite : public Sprite
private:
// Variables
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<Path> paths_; // Caminos a recorrer por el sprite
@@ -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<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;
}
// 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<std::string> &vec, const std::string &str)
{

View File

@@ -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<std::string> &vec, const std::string &str);