mogut el contador de frames a un struct i de paso el shake_effect també l'he encapsulat millor
This commit is contained in:
184
source/screen.h
184
source/screen.h
@@ -28,29 +28,34 @@ private:
|
||||
// Constantes
|
||||
static constexpr int WINDOWS_DECORATIONS_ = 35;
|
||||
|
||||
// [SINGLETON] Objeto privado
|
||||
static Screen *screen_;
|
||||
// Estructuras
|
||||
struct FPS
|
||||
{
|
||||
Uint32 ticks; // Tiempo en milisegundos desde que se comenzó a contar.
|
||||
int frameCount; // Número acumulado de frames en el intervalo.
|
||||
int lastValue; // Número de frames calculado en el último segundo.
|
||||
|
||||
// Objetos y punteros
|
||||
SDL_Window *window_; // Ventana de la aplicación
|
||||
SDL_Renderer *renderer_; // El renderizador de la ventana
|
||||
SDL_Texture *game_canvas_; // Textura donde se dibuja todo antes de volcarse al renderizador
|
||||
// Constructor para inicializar la estructura.
|
||||
FPS() : ticks(0), frameCount(0), lastValue(0) {}
|
||||
|
||||
// Variables
|
||||
SDL_Rect src_rect_; // Coordenadas de donde va a pillar la textura del juego para dibujarla
|
||||
SDL_Rect dst_rect_; // Coordenadas donde se va a dibujar la textura del juego sobre la pantalla o ventana
|
||||
bool attenuate_effect_ = false; // Indica si la pantalla ha de estar atenuada
|
||||
Uint32 fps_ticks_ = 0; // Ticks para contar los frames por segundo
|
||||
int fps_counter_ = 0; // Contador de frames por segundo
|
||||
int fps_ = 0; // Frames calculados en el último segundo
|
||||
std::string info_resolution_; // Texto con la informacion de la pantalla
|
||||
std::string shader_source_; // Almacena el contenido del archivo GLSL
|
||||
// Incrementador que se llama en cada frame.
|
||||
void increment()
|
||||
{
|
||||
frameCount++;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
bool show_debug_info_ = false; // Indica si ha de mostrar/ocultar la información de la pantalla
|
||||
#else
|
||||
bool show_debug_info_ = false; // Indica si ha de mostrar/ocultar la información de la pantalla
|
||||
#endif
|
||||
// Método para calcular y devolver el valor de FPS.
|
||||
int calculate(Uint32 currentTicks)
|
||||
{
|
||||
if (currentTicks - ticks >= 1000) // Si ha pasado un segundo o más.
|
||||
{
|
||||
lastValue = frameCount; // Actualizamos el valor del último FPS.
|
||||
frameCount = 0; // Reiniciamos el contador de frames.
|
||||
ticks = currentTicks; // Actualizamos el tiempo base.
|
||||
}
|
||||
return lastValue;
|
||||
}
|
||||
};
|
||||
|
||||
struct FlashEffect
|
||||
{
|
||||
@@ -73,42 +78,111 @@ private:
|
||||
|
||||
struct ShakeEffect
|
||||
{
|
||||
int desp; // Pixels de desplazamiento para agitar la pantalla en el eje x
|
||||
int delay; // Retraso entre cada desplazamiento de la pantalla al agitarse
|
||||
int counter; // Contador para el retraso
|
||||
int lenght; // Cantidad de desplazamientos a realizar
|
||||
int remaining; // Cantidad de desplazamientos pendientes a realizar
|
||||
int originalPos; // Posición inicial de la pantalla para dejarla igual tras el desplazamiento
|
||||
int originalWidth; // Anchura inicial de la pantalla para dejarla igual tras el desplazamiento
|
||||
bool enabled; // Indica si el efecto está activo
|
||||
int desp; // Pixels de desplazamiento para agitar la pantalla en el eje x
|
||||
int delay; // Retraso entre cada desplazamiento de la pantalla al agitarse
|
||||
int counter; // Contador para el retraso
|
||||
int lenght; // Cantidad de desplazamientos a realizar
|
||||
int remaining; // Cantidad de desplazamientos pendientes a realizar
|
||||
int original_pos; // Posición inicial de la pantalla para dejarla igual tras el desplazamiento
|
||||
int original_width; // Anchura inicial de la pantalla para dejarla igual tras el desplazamiento
|
||||
bool enabled; // Indica si el efecto está activo
|
||||
|
||||
// Constructor
|
||||
explicit ShakeEffect(bool en = false, int dp = 2, int dl = 3, int cnt = 0, int len = 8, int rem = 0, int origPos = 0, int origWidth = param.game.width)
|
||||
: desp(dp), delay(dl), counter(cnt), lenght(len), remaining(rem), originalPos(origPos), originalWidth(origWidth), enabled(en) {}
|
||||
explicit ShakeEffect(bool en = false, int dp = 2, int dl = 3, int cnt = 0, int len = 8, int rem = 0, int origPos = 0, int origWidth = 800)
|
||||
: desp(dp), delay(dl), counter(cnt), lenght(len), remaining(rem), original_pos(origPos), original_width(origWidth), enabled(en) {}
|
||||
|
||||
// Método para habilitar el efecto
|
||||
void enable(SDL_Rect &src_rect, SDL_Rect &dst_rect)
|
||||
{
|
||||
if (!enabled)
|
||||
{
|
||||
// Configurar el estado inicial si el efecto no está activo
|
||||
enabled = true;
|
||||
original_pos = src_rect.x;
|
||||
original_width = src_rect.w;
|
||||
|
||||
// Acortar los anchos iniciales durante el efecto
|
||||
src_rect.w -= desp;
|
||||
dst_rect.w = src_rect.w;
|
||||
}
|
||||
|
||||
// Renovar contadores y duración del efecto
|
||||
remaining = lenght;
|
||||
counter = delay;
|
||||
}
|
||||
|
||||
// Método para actualizar el efecto de movimiento/agitación
|
||||
void update(SDL_Rect &src_rect, SDL_Rect &dst_rect)
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
if (counter > 0)
|
||||
{
|
||||
counter--;
|
||||
}
|
||||
else
|
||||
{
|
||||
counter = delay;
|
||||
|
||||
// Calcular desplazamientos según el estado de la agitación
|
||||
const auto SRC_DESP = (remaining % 2 == 0) ? 0 : desp;
|
||||
const auto DST_DESP = (remaining % 2 == 1) ? 0 : desp;
|
||||
|
||||
src_rect.x = original_pos + SRC_DESP;
|
||||
dst_rect.x = original_pos + DST_DESP;
|
||||
|
||||
remaining--;
|
||||
|
||||
if (remaining == -1)
|
||||
{
|
||||
// Restaurar posición y dimensiones originales
|
||||
enabled = false;
|
||||
src_rect.x = original_pos;
|
||||
src_rect.w = original_width;
|
||||
dst_rect.x = original_pos;
|
||||
dst_rect.w = original_width;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Método para comprobar si el efecto está activo
|
||||
bool isEnabled() const
|
||||
{
|
||||
return enabled;
|
||||
}
|
||||
};
|
||||
|
||||
// Variables - Efectos
|
||||
FlashEffect flash_effect_; // Variable para gestionar el efecto de flash
|
||||
ShakeEffect shake_effect_; // Variable para gestionar el efecto de agitar la pantalla
|
||||
// [SINGLETON] Objeto privado
|
||||
static Screen *screen_;
|
||||
|
||||
// Actualiza la logica para agitar la pantalla
|
||||
void updateShakeEffect();
|
||||
// Objetos y punteros
|
||||
SDL_Window *window_; // Ventana de la aplicación
|
||||
SDL_Renderer *renderer_; // El renderizador de la ventana
|
||||
SDL_Texture *game_canvas_; // Textura donde se dibuja todo antes de volcarse al renderizador
|
||||
|
||||
// Variables
|
||||
SDL_Rect src_rect_; // Coordenadas de donde va a pillar la textura del juego para dibujarla
|
||||
SDL_Rect dst_rect_; // Coordenadas donde se va a dibujar la textura del juego sobre la pantalla o ventana
|
||||
FPS fps_; // Variable para gestionar los frames por segundo
|
||||
std::string info_resolution_; // Texto con la informacion de la pantalla
|
||||
std::string shader_source_; // Almacena el contenido del archivo GLSL
|
||||
FlashEffect flash_effect_; // Variable para gestionar el efecto de flash
|
||||
ShakeEffect shake_effect_; // Variable para gestionar el efecto de agitar la pantalla
|
||||
bool attenuate_effect_ = false; // Indica si la pantalla ha de estar atenuada
|
||||
|
||||
#ifdef DEBUG
|
||||
bool show_debug_info_ = false; // Indica si ha de mostrar/ocultar la información de la pantalla
|
||||
#else
|
||||
bool show_debug_info_ = false; // Indica si ha de mostrar/ocultar la información de la pantalla
|
||||
#endif
|
||||
|
||||
// Dibuja el efecto de flash en la pantalla
|
||||
void renderFlash();
|
||||
|
||||
// Actualiza el efecto de flash
|
||||
void updateFlash();
|
||||
|
||||
// Atenua la pantalla
|
||||
void renderAttenuate();
|
||||
|
||||
// Aplica el efecto de agitar la pantalla
|
||||
void renderShake();
|
||||
|
||||
// Calcula los frames por segundo
|
||||
void updateFPS();
|
||||
|
||||
// Muestra información por pantalla
|
||||
void renderInfo();
|
||||
|
||||
@@ -125,7 +199,7 @@ private:
|
||||
void adjustWindowSize();
|
||||
|
||||
// Ajusta el tamaño lógico del renderizador
|
||||
void adjustRenderLogicalSize();
|
||||
void adjustRenderLogicalSize() { SDL_RenderSetLogicalSize(renderer_, param.game.width, param.game.height); }
|
||||
|
||||
// Obtiene el tamaño máximo de zoom posible para la ventana
|
||||
int getMaxZoom();
|
||||
@@ -133,6 +207,9 @@ private:
|
||||
// Renderiza todos los overlays y efectos
|
||||
void renderOverlays();
|
||||
|
||||
// Atenua la pantalla
|
||||
void renderAttenuate();
|
||||
|
||||
// Constructor
|
||||
Screen(SDL_Window *window, SDL_Renderer *renderer);
|
||||
|
||||
@@ -176,23 +253,17 @@ public:
|
||||
// Aumenta el tamaño de la ventana
|
||||
bool incWindowZoom();
|
||||
|
||||
// Cambia el tipo de mezcla
|
||||
void setBlendMode(SDL_BlendMode blend_mode);
|
||||
|
||||
// Agita la pantalla
|
||||
void shake();
|
||||
void shake() { shake_effect_.enable(src_rect_, dst_rect_); }
|
||||
|
||||
// Pone la pantalla de color
|
||||
void flash(Color color, int lenght, int delay = 0);
|
||||
void flash(Color color, int lenght = 10, int delay = 0) { flash_effect_ = FlashEffect(true, lenght, delay, color); }
|
||||
|
||||
// Activa / desactiva los shaders
|
||||
void toggleShaders();
|
||||
void toggleShaders() { options.video.shaders = !options.video.shaders; }
|
||||
|
||||
// Activa / desactiva la información de debug
|
||||
void toggleDebugInfo();
|
||||
|
||||
// Atenua la pantalla
|
||||
void attenuate(bool value);
|
||||
void toggleDebugInfo() { show_debug_info_ = !show_debug_info_; }
|
||||
|
||||
// Getters
|
||||
SDL_Renderer *getRenderer() { return renderer_; }
|
||||
@@ -202,4 +273,7 @@ public:
|
||||
|
||||
// Oculta la ventana
|
||||
void hide() { SDL_HideWindow(window_); }
|
||||
|
||||
// Atenua la pantalla
|
||||
void attenuate(bool value) { attenuate_effect_ = value; }
|
||||
};
|
||||
Reference in New Issue
Block a user