Treballant en la intro
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
#include "section.h"
|
#include "section.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
namespace globalEvents
|
namespace globalEvents
|
||||||
{
|
{
|
||||||
@@ -16,12 +17,12 @@ namespace globalEvents
|
|||||||
return;
|
return;
|
||||||
case SDL_RENDER_DEVICE_RESET:
|
case SDL_RENDER_DEVICE_RESET:
|
||||||
case SDL_RENDER_TARGETS_RESET:
|
case SDL_RENDER_TARGETS_RESET:
|
||||||
Resource::get()->reloadTextures();
|
//Resource::get()->reloadTextures();
|
||||||
break;
|
break;
|
||||||
case SDL_WINDOWEVENT:
|
case SDL_WINDOWEVENT:
|
||||||
if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
|
if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
|
||||||
{
|
{
|
||||||
Resource::get()->reloadTextures();
|
//Resource::get()->reloadTextures();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
114
source/intro.cpp
114
source/intro.cpp
@@ -36,6 +36,7 @@ Intro::Intro()
|
|||||||
|
|
||||||
// Configura el fondo
|
// Configura el fondo
|
||||||
tiled_bg_->setSpeed(0.3f);
|
tiled_bg_->setSpeed(0.3f);
|
||||||
|
tiled_bg_->setColor(Color(bg_color_, bg_color_, bg_color_));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba los eventos
|
// Comprueba los eventos
|
||||||
@@ -66,7 +67,6 @@ void Intro::updateScenes()
|
|||||||
if (sprites_.at(0)->hasFinished() && !texts_.at(0)->hasFinished())
|
if (sprites_.at(0)->hasFinished() && !texts_.at(0)->hasFinished())
|
||||||
{
|
{
|
||||||
texts_.at(0)->setEnabled(true);
|
texts_.at(0)->setEnabled(true);
|
||||||
tiled_bg_->stopGracefully();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Segundo texto de la primera imagen
|
// Segundo texto de la primera imagen
|
||||||
@@ -195,16 +195,19 @@ void Intro::updateScenes()
|
|||||||
if (!texts_.at(8)->hasFinished())
|
if (!texts_.at(8)->hasFinished())
|
||||||
{
|
{
|
||||||
texts_.at(8)->setEnabled(true);
|
texts_.at(8)->setEnabled(true);
|
||||||
tiled_bg_->stopGracefully();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Acaba el último texto
|
// Acaba el último texto
|
||||||
if (sprites_.at(5)->hasFinished() && texts_.at(8)->hasFinished())
|
if (texts_.at(8)->hasFinished())
|
||||||
{
|
{
|
||||||
texts_.at(8)->setEnabled(false);
|
texts_.at(8)->setEnabled(false);
|
||||||
JA_StopMusic();
|
}
|
||||||
section::name = section::Name::TITLE;
|
|
||||||
section::options = section::Options::TITLE_1;
|
// Acaba la ultima imagen
|
||||||
|
if (sprites_.at(5)->hasFinished() && texts_.at(8)->hasFinished())
|
||||||
|
{
|
||||||
|
state_ = IntroState::POST;
|
||||||
|
state_start_time_ = SDL_GetTicks();
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -226,14 +229,18 @@ void Intro::update()
|
|||||||
// Actualiza el fondo
|
// Actualiza el fondo
|
||||||
tiled_bg_->update();
|
tiled_bg_->update();
|
||||||
|
|
||||||
// Actualiza los sprites
|
switch (state_)
|
||||||
updateSprites();
|
{
|
||||||
|
case IntroState::SCENES:
|
||||||
|
updateSprites();
|
||||||
|
updateTexts();
|
||||||
|
updateScenes();
|
||||||
|
break;
|
||||||
|
|
||||||
// Actualiza los textos
|
case IntroState::POST:
|
||||||
updateTexts();
|
updatePostState();
|
||||||
|
break;
|
||||||
// Actualiza las escenas de la intro
|
}
|
||||||
updateScenes();
|
|
||||||
|
|
||||||
// Actualiza el objeto screen
|
// Actualiza el objeto screen
|
||||||
Screen::get()->update();
|
Screen::get()->update();
|
||||||
@@ -255,14 +262,17 @@ void Intro::render()
|
|||||||
// Dibuja el fondo
|
// Dibuja el fondo
|
||||||
tiled_bg_->render();
|
tiled_bg_->render();
|
||||||
|
|
||||||
SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0, 0, 0, 128);
|
switch (state_)
|
||||||
SDL_RenderFillRect(Screen::get()->getRenderer(), ¶m.game.game_area.rect);
|
{
|
||||||
|
case IntroState::SCENES:
|
||||||
// Dibuja los sprites
|
{
|
||||||
renderSprites();
|
renderSprites();
|
||||||
|
renderTexts();
|
||||||
// Dibuja los textos
|
break;
|
||||||
renderTexts();
|
}
|
||||||
|
case IntroState::POST:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Vuelca el contenido del renderizador en pantalla
|
// Vuelca el contenido del renderizador en pantalla
|
||||||
Screen::get()->render();
|
Screen::get()->render();
|
||||||
@@ -316,7 +326,8 @@ void Intro::initSprites()
|
|||||||
sprites_.at(2)->addPath(-SPRITE_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 40, easeOutQuint, 0);
|
sprites_.at(2)->addPath(-SPRITE_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(3)->addPath(param.game.height, Y_DEST, PathType::VERTICAL, X_DEST, 800, easeOutQuint, 0);
|
||||||
sprites_.at(4)->addPath(-SPRITE_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 70, easeOutElastic, 0);
|
sprites_.at(4)->addPath(-SPRITE_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);
|
sprites_.at(5)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 400, easeOutQuad, 300);
|
||||||
|
sprites_.at(5)->addPath(X_DEST, -SPRITE_WIDTH, PathType::HORIZONTAL, Y_DEST, 80, easeInElastic, 0);
|
||||||
|
|
||||||
// Constantes
|
// Constantes
|
||||||
const int BORDER = 4;
|
const int BORDER = 4;
|
||||||
@@ -334,20 +345,20 @@ void Intro::initSprites()
|
|||||||
auto shadow_texture = std::make_shared<Texture>(Screen::get()->getRenderer());
|
auto shadow_texture = std::make_shared<Texture>(Screen::get()->getRenderer());
|
||||||
shadow_texture->createBlank(SHADOW_SPRITE_WIDTH, SHADOW_SPRITE_HEIGHT, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET);
|
shadow_texture->createBlank(SHADOW_SPRITE_WIDTH, SHADOW_SPRITE_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());
|
||||||
|
|
||||||
SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0xFF, 0x00, 0x00, 0xFF);
|
SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0xFF, 0x00, 0x00, 0xFF);
|
||||||
SDL_RenderClear(Screen::get()->getRenderer());
|
SDL_RenderClear(Screen::get()->getRenderer());
|
||||||
|
|
||||||
SDL_Rect rect = {BORDER / 2, BORDER / 2, SPRITE_WIDTH, SPRITE_HEIGHT};
|
SDL_Rect rect = {BORDER / 2, BORDER / 2, SPRITE_WIDTH, SPRITE_HEIGHT};
|
||||||
auto texture = Resource::get()->getTexture(TEXTURE_LIST.at(i))->getSDLTexture();
|
auto texture = Resource::get()->getTexture(TEXTURE_LIST.at(i))->getSDLTexture();
|
||||||
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_MOD);
|
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_MOD);
|
||||||
SDL_RenderCopy(Screen::get()->getRenderer(), texture, nullptr, &rect);
|
SDL_RenderCopy(Screen::get()->getRenderer(), texture, nullptr, &rect);
|
||||||
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_NONE);
|
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_NONE);
|
||||||
|
|
||||||
shadow_texture->setAlpha(160);
|
//shadow_texture->setAlpha(160);
|
||||||
|
|
||||||
SDL_SetRenderTarget(Screen::get()->getRenderer(), temp);
|
SDL_SetRenderTarget(Screen::get()->getRenderer(), temp);
|
||||||
shadow_textures.push_back(shadow_texture);
|
shadow_textures.push_back(shadow_texture);
|
||||||
@@ -368,7 +379,8 @@ void Intro::initSprites()
|
|||||||
shadow_sprites_.at(2)->addPath(-SHADOW_SPRITE_WIDTH, S_X_DEST, PathType::HORIZONTAL, S_Y_DEST, 40, easeOutQuint, 0);
|
shadow_sprites_.at(2)->addPath(-SHADOW_SPRITE_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(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(4)->addPath(param.game.height, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 70, easeOutElastic, 0);
|
||||||
shadow_sprites_.at(5)->addPath(-SHADOW_SPRITE_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 400, easeOutQuint, 0);
|
shadow_sprites_.at(5)->addPath(-SHADOW_SPRITE_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 400, easeOutQuad, 300);
|
||||||
|
shadow_sprites_.at(5)->addPath(S_X_DEST, param.game.width, PathType::HORIZONTAL, S_Y_DEST, 80, easeInElastic, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inicializa los textos
|
// Inicializa los textos
|
||||||
@@ -465,4 +477,48 @@ void Intro::renderTexts()
|
|||||||
{
|
{
|
||||||
text->render();
|
text->render();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Actualiza el estado POST
|
||||||
|
void Intro::updatePostState()
|
||||||
|
{
|
||||||
|
const Uint32 ELAPSED_TIME = SDL_GetTicks() - state_start_time_;
|
||||||
|
|
||||||
|
switch (post_state_)
|
||||||
|
{
|
||||||
|
case IntroPostState::STOP_BG:
|
||||||
|
// EVENTO: Detiene el fondo después de 2 segundos
|
||||||
|
if (ELAPSED_TIME >= 1000)
|
||||||
|
{
|
||||||
|
tiled_bg_->stopGracefully();
|
||||||
|
|
||||||
|
// Modifica el color del fondo hasta llegar a blanco
|
||||||
|
if (bg_color_ < 255)
|
||||||
|
{
|
||||||
|
++bg_color_;
|
||||||
|
tiled_bg_->setColor(Color(bg_color_, bg_color_, bg_color_));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cambia de estado si el fondo se ha detenido y recuperado el color
|
||||||
|
if (tiled_bg_->isStopped() && bg_color_ == 255)
|
||||||
|
{
|
||||||
|
post_state_ = IntroPostState::END;
|
||||||
|
state_start_time_ = SDL_GetTicks();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IntroPostState::END:
|
||||||
|
// Finaliza la intro después de 3 segundos
|
||||||
|
if (ELAPSED_TIME >= 2000)
|
||||||
|
{
|
||||||
|
JA_StopMusic();
|
||||||
|
section::name = section::Name::TITLE;
|
||||||
|
section::options = section::Options::TITLE_1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
#include "path_sprite.h" // Para PathSprite
|
#include "path_sprite.h" // Para PathSprite
|
||||||
#include "writer.h" // Para Writer
|
#include "writer.h" // Para Writer
|
||||||
#include "tiled_bg.h"
|
#include "tiled_bg.h"
|
||||||
class Text; // lines 8-8
|
class Text; // lines 8-8
|
||||||
class Texture; // lines 9-9
|
class Texture; // lines 9-9
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Esta clase gestiona un estado del programa. Se encarga de mostrar la secuencia
|
Esta clase gestiona un estado del programa. Se encarga de mostrar la secuencia
|
||||||
@@ -19,6 +19,18 @@ class Texture; // lines 9-9
|
|||||||
class Intro
|
class Intro
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
enum class IntroState
|
||||||
|
{
|
||||||
|
SCENES,
|
||||||
|
POST,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class IntroPostState
|
||||||
|
{
|
||||||
|
STOP_BG,
|
||||||
|
END,
|
||||||
|
};
|
||||||
|
|
||||||
// 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<PathSprite>> shadow_sprites_; // Vector con los sprites inteligentes para las sombras
|
std::vector<std::unique_ptr<PathSprite>> shadow_sprites_; // Vector con los sprites inteligentes para las sombras
|
||||||
@@ -26,8 +38,12 @@ private:
|
|||||||
std::unique_ptr<TiledBG> tiled_bg_;
|
std::unique_ptr<TiledBG> tiled_bg_;
|
||||||
|
|
||||||
// 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
|
||||||
int scene_ = 0; // Indica que escena está activa
|
int scene_ = 0; // Indica que escena está activa
|
||||||
|
IntroState state_ = IntroState::SCENES; // Estado
|
||||||
|
IntroPostState post_state_ = IntroPostState::STOP_BG; // Estado
|
||||||
|
Uint32 state_start_time_;
|
||||||
|
Uint8 bg_color_ = 96;
|
||||||
|
|
||||||
// Actualiza las variables del objeto
|
// Actualiza las variables del objeto
|
||||||
void update();
|
void update();
|
||||||
@@ -62,6 +78,9 @@ private:
|
|||||||
// Dibuja los textos
|
// Dibuja los textos
|
||||||
void renderTexts();
|
void renderTexts();
|
||||||
|
|
||||||
|
// Actualiza el estado POST
|
||||||
|
void updatePostState();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Constructor
|
// Constructor
|
||||||
Intro();
|
Intro();
|
||||||
|
|||||||
@@ -380,7 +380,4 @@ void Texture::setPalette(int palette)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Obtiene el renderizador
|
// Obtiene el renderizador
|
||||||
SDL_Renderer *Texture::getRenderer()
|
SDL_Renderer *Texture::getRenderer(){ return renderer_;}
|
||||||
{
|
|
||||||
return renderer_;
|
|
||||||
}
|
|
||||||
@@ -19,19 +19,22 @@ TiledBG::TiledBG(SDL_Rect pos, TiledBGMode mode)
|
|||||||
// Rellena la textura con el contenido
|
// Rellena la textura con el contenido
|
||||||
fillTexture();
|
fillTexture();
|
||||||
|
|
||||||
mode_ = TiledBGMode::DIAGONAL;
|
// Inicializa variables
|
||||||
|
switch (mode_)
|
||||||
switch (mode)
|
|
||||||
{
|
{
|
||||||
|
case TiledBGMode::STATIC:
|
||||||
|
window_ = {0, 0, pos_.w, pos_.h};
|
||||||
|
speed_ = 0.0f;
|
||||||
|
break;
|
||||||
case TiledBGMode::DIAGONAL:
|
case TiledBGMode::DIAGONAL:
|
||||||
window_ = {0, 0, pos_.w, pos_.h};
|
window_ = {0, 0, pos_.w, pos_.h};
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TiledBGMode::CIRCLE:
|
case TiledBGMode::CIRCLE:
|
||||||
window_ = {128, 96, pos_.w, pos_.h};
|
window_ = {128, 128, pos_.w, pos_.h};
|
||||||
break;
|
speed_ = 0.8f;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
|
window_ = {0, 0, pos_.w, pos_.h};
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +107,7 @@ void TiledBG::update()
|
|||||||
const int INDEX = static_cast<int>(desp_) % 360;
|
const int INDEX = static_cast<int>(desp_) % 360;
|
||||||
|
|
||||||
window_.x = 128 + (static_cast<int>(sin_[(INDEX + 270) % 360] * 128));
|
window_.x = 128 + (static_cast<int>(sin_[(INDEX + 270) % 360] * 128));
|
||||||
window_.y = 96 + (static_cast<int>(sin_[(360 - INDEX) % 360] * 96));
|
window_.y = 128 + (static_cast<int>(sin_[(360 - INDEX) % 360] * 96));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <SDL2/SDL_rect.h> // Para SDL_Rect
|
#include <SDL2/SDL_rect.h> // Para SDL_Rect
|
||||||
#include <SDL2/SDL_render.h> // Para SDL_Renderer, SDL_Texture
|
#include <SDL2/SDL_render.h> // Para SDL_Renderer, SDL_Texture
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
// Modos de funcionamiento para el tileado de fondo
|
// Modos de funcionamiento para el tileado de fondo
|
||||||
enum class TiledBGMode : int
|
enum class TiledBGMode : int
|
||||||
@@ -67,4 +68,10 @@ public:
|
|||||||
|
|
||||||
// Detiene el desplazamiento de forma ordenada
|
// Detiene el desplazamiento de forma ordenada
|
||||||
void stopGracefully() { stopping_ = true; }
|
void stopGracefully() { stopping_ = true; }
|
||||||
|
|
||||||
|
// Cambia el color de la textura
|
||||||
|
void setColor(Color color) { SDL_SetTextureColorMod(canvas_, color.r, color.g, color.b); }
|
||||||
|
|
||||||
|
// Indica si está parado
|
||||||
|
bool isStopped() const { return speed_ == 0.0f; }
|
||||||
};
|
};
|
||||||
@@ -248,6 +248,13 @@ 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));
|
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 (easeInElastic)
|
||||||
|
double easeInElastic(double t)
|
||||||
|
{
|
||||||
|
return t == 0 ? 0 : (t == 1 ? 1 : -pow(2, 10 * t - 10) * sin((t * 10 - 10.75) * (2 * M_PI) / 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Función de suavizado
|
// Función de suavizado
|
||||||
double easeOutBounce(double t)
|
double easeOutBounce(double t)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -177,6 +177,7 @@ double easeInOut(double t);
|
|||||||
double easeInOutExpo(double t);
|
double easeInOutExpo(double t);
|
||||||
double easeOutBounce(double t);
|
double easeOutBounce(double t);
|
||||||
double easeOutElastic(double t);
|
double easeOutElastic(double t);
|
||||||
|
double easeInElastic(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);
|
||||||
|
|||||||
Reference in New Issue
Block a user