Treballant en la intro
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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_; }
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user