animació completada
This commit is contained in:
BIN
jailgames.gif
BIN
jailgames.gif
Binary file not shown.
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
116
source/logo.cpp
116
source/logo.cpp
@@ -1,14 +1,14 @@
|
|||||||
#include "logo.h"
|
#include "logo.h"
|
||||||
#include <SDL3/SDL_events.h> // Manejo de eventos de SDL (teclado, ratón, etc.)
|
#include <SDL3/SDL_events.h> // Manejo de eventos de SDL (teclado, ratón, etc.)
|
||||||
#include <SDL3/SDL_init.h> // Inicialización y limpieza de SDL
|
#include <SDL3/SDL_init.h> // Inicialización y limpieza de SDL
|
||||||
#include <SDL3/SDL_log.h> // Manejo de logs en SDL
|
#include <SDL3/SDL_log.h> // Manejo de logs en SDL
|
||||||
#include <SDL3/SDL_timer.h> // Funciones de temporización de SDL
|
#include <SDL3/SDL_timer.h> // Funciones de temporización de SDL
|
||||||
#include "global_inputs.h" // Funciones para manejar entradas globales
|
#include "global_inputs.h" // Funciones para manejar entradas globales
|
||||||
#include "mouse.h" // Manejo de eventos del ratón
|
#include "mouse.h" // Manejo de eventos del ratón
|
||||||
#include "options.h" // Configuración global de opciones
|
#include "options.h" // Configuración global de opciones
|
||||||
#include "s_sprite.h" // Clase para manejar sprites
|
#include "s_sprite.h" // Clase para manejar sprites
|
||||||
#include "screen.h" // Clase para manejar la pantalla
|
#include "screen.h" // Clase para manejar la pantalla
|
||||||
#include "surface.h" // Clase para manejar superficies
|
#include "surface.h" // Clase para manejar superficies
|
||||||
|
|
||||||
// Constructor de la clase Logo: inicializa los recursos necesarios
|
// Constructor de la clase Logo: inicializa los recursos necesarios
|
||||||
Logo::Logo()
|
Logo::Logo()
|
||||||
@@ -35,6 +35,7 @@ void Logo::init()
|
|||||||
// Carga la superficie del logotipo desde un archivo y la escala
|
// Carga la superficie del logotipo desde un archivo y la escala
|
||||||
logo_surface = std::make_shared<Surface>("jailgames.gif");
|
logo_surface = std::make_shared<Surface>("jailgames.gif");
|
||||||
logo_surface->setTransparentColor(0);
|
logo_surface->setTransparentColor(0);
|
||||||
|
blackOutPalette();
|
||||||
|
|
||||||
// Crea el sprite del logotipo y lo posiciona en el centro de la pantalla
|
// Crea el sprite del logotipo y lo posiciona en el centro de la pantalla
|
||||||
logo_sprite = std::make_unique<SSprite>(logo_surface);
|
logo_sprite = std::make_unique<SSprite>(logo_surface);
|
||||||
@@ -42,6 +43,9 @@ void Logo::init()
|
|||||||
(options.logo.width - logo_sprite->getWidth()) / 2,
|
(options.logo.width - logo_sprite->getWidth()) / 2,
|
||||||
(options.logo.height - logo_sprite->getHeight()) / 2);
|
(options.logo.height - logo_sprite->getHeight()) / 2);
|
||||||
|
|
||||||
|
// Inicia el contador de tiempo
|
||||||
|
init_time = SDL_GetTicks();
|
||||||
|
|
||||||
// Log de inicio del logotipo
|
// Log de inicio del logotipo
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Logo start");
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Logo start");
|
||||||
}
|
}
|
||||||
@@ -67,7 +71,7 @@ void Logo::checkEvents()
|
|||||||
{
|
{
|
||||||
switch (event.type)
|
switch (event.type)
|
||||||
{
|
{
|
||||||
case SDL_EVENT_QUIT: // Evento de salida (cerrar la ventana)
|
case SDL_EVENT_QUIT: // Evento de salida (cerrar la ventana)
|
||||||
options.logo.running = false; // Detiene el bucle principal
|
options.logo.running = false; // Detiene el bucle principal
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -88,6 +92,9 @@ void Logo::update()
|
|||||||
|
|
||||||
// Actualiza la pantalla
|
// Actualiza la pantalla
|
||||||
Screen::get()->update();
|
Screen::get()->update();
|
||||||
|
|
||||||
|
// Gestiona los diferentes estados del logo
|
||||||
|
updateState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,3 +117,90 @@ int Logo::run()
|
|||||||
}
|
}
|
||||||
return 0; // Devuelve 0 al finalizar
|
return 0; // Devuelve 0 al finalizar
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Transforma todos los colores de la paleta a negro
|
||||||
|
void Logo::blackOutPalette()
|
||||||
|
{
|
||||||
|
for (int i = 1; i < 256; ++i)
|
||||||
|
{
|
||||||
|
Screen::get()->getRendererSurface()->setColor(i, 0xFF000000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gestiona los diferentes estados del logo
|
||||||
|
void Logo::updateState()
|
||||||
|
{
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case LogoState::BLACK:
|
||||||
|
elapsed_time = SDL_GetTicks() - init_time;
|
||||||
|
if (elapsed_time > 2000)
|
||||||
|
{
|
||||||
|
state = LogoState::LINES;
|
||||||
|
init_time = SDL_GetTicks();
|
||||||
|
steps[69] = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LogoState::LINES:
|
||||||
|
elapsed_time = SDL_GetTicks() - init_time;
|
||||||
|
if (elapsed_time > 50)
|
||||||
|
{
|
||||||
|
init_time = SDL_GetTicks();
|
||||||
|
if (advancePaletteStep(70, steps, max_step))
|
||||||
|
{
|
||||||
|
state = LogoState::COMPLETE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LogoState::COMPLETE:
|
||||||
|
elapsed_time = SDL_GetTicks() - init_time;
|
||||||
|
if (elapsed_time > 5000)
|
||||||
|
{
|
||||||
|
state = LogoState::END;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LogoState::END:
|
||||||
|
options.logo.running = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Logo::advancePaletteStep(int size, int steps[], int max_step)
|
||||||
|
{
|
||||||
|
bool allDone = true;
|
||||||
|
|
||||||
|
for (int i = 1; i < size; ++i)
|
||||||
|
{
|
||||||
|
if (steps[i] > 0 && steps[i] < max_step)
|
||||||
|
{
|
||||||
|
// Avanza un paso
|
||||||
|
steps[i]++;
|
||||||
|
// Calcula la intensidad del color
|
||||||
|
int intensity = (steps[i] * 256) / max_step;
|
||||||
|
if (intensity > 255)
|
||||||
|
intensity = 255;
|
||||||
|
// Actualiza el color al nuevo valor en formato ARGB
|
||||||
|
Screen::get()->getRendererSurface()->setColor(i, 0xFF000000 | (intensity << 16) | (intensity << 8) | intensity);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < size - 1 && steps[i + 1] >= 2 && steps[i] == 0)
|
||||||
|
{
|
||||||
|
// Inicia el paso de este color si el siguiente ha avanzado al menos dos pasos
|
||||||
|
steps[i] = 1;
|
||||||
|
Screen::get()->getRendererSurface()->setColor(i, 0xFF000000 | (64 << 16) | (64 << 8) | 64); // Paso inicial
|
||||||
|
}
|
||||||
|
|
||||||
|
if (steps[i] < max_step)
|
||||||
|
{
|
||||||
|
allDone = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return allDone;
|
||||||
|
}
|
||||||
@@ -10,9 +10,21 @@ class Surface; // Declaración adelantada de la clase Surface
|
|||||||
class Logo
|
class Logo
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
enum class LogoState
|
||||||
|
{
|
||||||
|
BLACK,
|
||||||
|
LINES,
|
||||||
|
COMPLETE,
|
||||||
|
END
|
||||||
|
};
|
||||||
|
|
||||||
Uint64 ticks = 0; // Contador de ticks para medir el tiempo o controlar animaciones
|
Uint64 ticks = 0; // Contador de ticks para medir el tiempo o controlar animaciones
|
||||||
std::shared_ptr<Surface> logo_surface = nullptr; // Superficie del logotipo, compartida entre múltiples objetos
|
std::shared_ptr<Surface> logo_surface = nullptr; // Superficie del logotipo, compartida entre múltiples objetos
|
||||||
std::unique_ptr<SSprite> logo_sprite = nullptr; // Sprite del logotipo, propiedad exclusiva de esta clase
|
std::unique_ptr<SSprite> logo_sprite = nullptr; // Sprite del logotipo, propiedad exclusiva de esta clase
|
||||||
|
LogoState state = LogoState::BLACK; // Gestiona los estados del logo
|
||||||
|
Uint64 init_time = 0, elapsed_time = 0; // Para medir el tiempo transcurrido
|
||||||
|
int steps[70] = {0};
|
||||||
|
int max_step = 8;
|
||||||
|
|
||||||
// Métodos privados para manejar el ciclo de vida y la lógica del logotipo
|
// Métodos privados para manejar el ciclo de vida y la lógica del logotipo
|
||||||
void init(); // Inicializa los recursos necesarios para el logotipo
|
void init(); // Inicializa los recursos necesarios para el logotipo
|
||||||
@@ -21,6 +33,11 @@ private:
|
|||||||
void update(); // Actualiza el estado del logotipo (animaciones, lógica, etc.)
|
void update(); // Actualiza el estado del logotipo (animaciones, lógica, etc.)
|
||||||
void render(); // Renderiza el logotipo en pantalla
|
void render(); // Renderiza el logotipo en pantalla
|
||||||
|
|
||||||
|
// Métodos específicos
|
||||||
|
void blackOutPalette(); // Transforma todos los colores de la paleta a negro
|
||||||
|
void updateState(); // Gestiona los diferentes estados del logo
|
||||||
|
bool advancePaletteStep(int size, int steps[], int maxStep);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Logo(); // Constructor: Inicializa la clase Logo
|
Logo(); // Constructor: Inicializa la clase Logo
|
||||||
~Logo(); // Destructor: Limpia los recursos utilizados por la clase Logo
|
~Logo(); // Destructor: Limpia los recursos utilizados por la clase Logo
|
||||||
|
|||||||
@@ -171,12 +171,6 @@ void Surface::loadPalette(Palette palette)
|
|||||||
palette_ = palette;
|
palette_ = palette;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Establece un color en la paleta
|
|
||||||
void Surface::setColor(int index, Uint32 color)
|
|
||||||
{
|
|
||||||
palette_.at(index) = color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rellena la superficie con un color
|
// Rellena la superficie con un color
|
||||||
void Surface::clear(Uint8 color)
|
void Surface::clear(Uint8 color)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <SDL3/SDL_rect.h> // for SDL_Rect, SDL_FRect
|
#include <SDL3/SDL_rect.h> // for SDL_Rect, SDL_FRect
|
||||||
#include <SDL3/SDL_render.h> // for SDL_Renderer, SDL_Texture
|
#include <SDL3/SDL_render.h> // for SDL_Renderer, SDL_Texture
|
||||||
#include <SDL3/SDL_stdinc.h> // for Uint8, Uint16, Uint32
|
#include <SDL3/SDL_stdinc.h> // for Uint8, Uint16, Uint32
|
||||||
#include <SDL3/SDL_surface.h> // for SDL_FlipMode
|
#include <SDL3/SDL_surface.h> // for SDL_FlipMode
|
||||||
#include <array> // for array
|
#include <array> // for array
|
||||||
#include <memory> // for default_delete, shared_ptr, __shared_p...
|
#include <memory> // for default_delete, shared_ptr, __shared_p...
|
||||||
#include <numeric> // for iota
|
#include <numeric> // for iota
|
||||||
#include <stdexcept> // for invalid_argument
|
#include <stdexcept> // for invalid_argument
|
||||||
#include <string> // for string
|
#include <string> // for string
|
||||||
#include <utility> // for move
|
#include <utility> // for move
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
// Alias
|
// Alias
|
||||||
using Palette = std::array<Uint32, 256>;
|
using Palette = std::array<Uint32, 256>;
|
||||||
@@ -110,6 +111,9 @@ public:
|
|||||||
void loadPalette(const std::string &file_path);
|
void loadPalette(const std::string &file_path);
|
||||||
void loadPalette(Palette palette);
|
void loadPalette(Palette palette);
|
||||||
|
|
||||||
|
// Obtiene la paleta
|
||||||
|
Palette &getPalette() { return palette_; }
|
||||||
|
|
||||||
// Copia una región de la SurfaceData de origen a la SurfaceData de destino
|
// Copia una región de la SurfaceData de origen a la SurfaceData de destino
|
||||||
void render(int dx, int dy, int sx, int sy, int w, int h);
|
void render(int dx, int dy, int sx, int sy, int w, int h);
|
||||||
void render(int x, int y, SDL_Rect *clip = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE);
|
void render(int x, int y, SDL_Rect *clip = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE);
|
||||||
@@ -118,9 +122,6 @@ public:
|
|||||||
// Copia una región de la SurfaceData de origen a la SurfaceData de destino reemplazando un color por otro
|
// Copia una región de la SurfaceData de origen a la SurfaceData de destino reemplazando un color por otro
|
||||||
void renderWithColorReplace(int x, int y, Uint8 source_color = 0, Uint8 target_color = 0, SDL_Rect *srcRect = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE);
|
void renderWithColorReplace(int x, int y, Uint8 source_color = 0, Uint8 target_color = 0, SDL_Rect *srcRect = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE);
|
||||||
|
|
||||||
// Establece un color en la paleta
|
|
||||||
void setColor(int index, Uint32 color);
|
|
||||||
|
|
||||||
// Rellena la SurfaceData con un color
|
// Rellena la SurfaceData con un color
|
||||||
void clear(Uint8 color);
|
void clear(Uint8 color);
|
||||||
|
|
||||||
@@ -159,6 +160,9 @@ public:
|
|||||||
Uint8 getTransparentColor() const { return transparent_color_; }
|
Uint8 getTransparentColor() const { return transparent_color_; }
|
||||||
void setTransparentColor(Uint8 color = 255) { transparent_color_ = color; }
|
void setTransparentColor(Uint8 color = 255) { transparent_color_ = color; }
|
||||||
|
|
||||||
|
// Establece un color en la paleta
|
||||||
|
void setColor(int color, Uint32 value) { palette_.at(std::clamp(color, 0, 255)) = value; }
|
||||||
|
|
||||||
// Paleta
|
// Paleta
|
||||||
void setPalette(const std::array<Uint32, 256> &palette) { palette_ = palette; }
|
void setPalette(const std::array<Uint32, 256> &palette) { palette_ = palette; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user