fix: la classe Screen ja ha recuperat un poc del lustro que tenia

shake effect ja no està fet "the torerous menner"
shake effect ja va amb shaders
This commit is contained in:
2024-10-06 18:57:47 +02:00
parent afe092c742
commit fe6e63e39f
4 changed files with 83 additions and 31 deletions

View File

@@ -56,12 +56,14 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) : window(window), ren
flashEffect.counter = 0;
flashEffect.lenght = 0;
flashEffect.color = {0xFF, 0xFF, 0xFF};
shakeEffect.desp = 1;
shakeEffect.enabled = false;
shakeEffect.desp = 2;
shakeEffect.delay = 3;
shakeEffect.counter = 0;
shakeEffect.lenght = 8;
shakeEffect.remaining = 0;
shakeEffect.origin = 0;
shakeEffect.originalPos = 0;
shakeEffect.originalWidth = param.game.width;
attenuateEffect = false;
fpsTicks = 0;
fpsCounter = 0;
@@ -81,8 +83,9 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) : window(window), ren
// Define el color del borde para el modo de pantalla completa
borderColor = {0x00, 0x00, 0x00};
// Crea la textura donde se dibujan los graficos del juego
// Crea las textura donde se dibujan los graficos del juego
gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height);
shaderCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height);
// Establece el modo de video
setVideoMode(options.video.mode);
@@ -95,6 +98,7 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) : window(window), ren
Screen::~Screen()
{
SDL_DestroyTexture(gameCanvas);
SDL_DestroyTexture(shaderCanvas);
}
// Limpia la pantalla
@@ -140,13 +144,22 @@ void Screen::blit()
SDL_RenderClear(renderer);
// Copia la textura de juego en el renderizador en la posición adecuada
SDL_RenderCopy(renderer, gameCanvas, nullptr, nullptr);
if (shakeEffect.enabled)
SDL_RenderCopy(renderer, gameCanvas, nullptr, nullptr);
SDL_RenderCopy(renderer, gameCanvas, &srcrect, &dstrect);
// Muestra por pantalla el renderizador
SDL_RenderPresent(renderer);
#else
if (options.video.shaders)
{
SDL_SetRenderTarget(renderer, shaderCanvas);
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
SDL_RenderClear(renderer);
if (shakeEffect.enabled)
SDL_RenderCopy(renderer, gameCanvas, nullptr, nullptr);
SDL_RenderCopy(renderer, gameCanvas, &srcrect, &dstrect);
SDL_SetRenderTarget(renderer, nullptr);
shader::render();
}
else
@@ -154,8 +167,14 @@ void Screen::blit()
// Vuelve a dejar el renderizador en modo normal
SDL_SetRenderTarget(renderer, nullptr);
// Borra el render
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
SDL_RenderClear(renderer);
// Copia la textura de juego en el renderizador en la posición adecuada
SDL_RenderCopy(renderer, gameCanvas, &srcrect, nullptr);
if (shakeEffect.enabled)
SDL_RenderCopy(renderer, gameCanvas, nullptr, nullptr);
SDL_RenderCopy(renderer, gameCanvas, &srcrect, &dstrect);
// Muestra por pantalla el renderizador
SDL_RenderPresent(renderer);
@@ -214,11 +233,12 @@ void Screen::setVideoMode(screenVideoMode videoMode)
std::ifstream f(asset->get("crtpi.glsl").c_str());
std::string source((std::istreambuf_iterator<char>(f)), std::istreambuf_iterator<char>());
shader::init(window, gameCanvas, source.c_str());
shader::init(window, shaderCanvas, source.c_str());
}
// Actualiza variables
shakeEffect.origin = srcrect.x;
// shakeEffect.originalPos = srcrect.x;
// shakeEffect.originalWidth = srcrect.w;
}
// Camibia entre pantalla completa y ventana
@@ -341,12 +361,17 @@ void Screen::checkInput()
// Agita la pantalla
void Screen::shake()
{
// Si ya hay un shake effect en marcha no se pilla el origen, solo se renuevan los contadores
if (shakeEffect.remaining == 0)
// Si no hay un shake effect activo, se guarda una copia de los valores actuales antes de modificarlos
if (!shakeEffect.enabled)
{
shakeEffect.origin = srcrect.x;
shakeEffect.enabled = true;
shakeEffect.originalPos = srcrect.x;
shakeEffect.originalWidth = srcrect.w;
srcrect.w -= shakeEffect.desp;
dstrect.w = srcrect.w;
}
// Si ya hay un shake effect en marcha no se pilla el origen, solo se renuevan los contadores
shakeEffect.remaining = shakeEffect.lenght;
shakeEffect.counter = shakeEffect.delay;
}
@@ -354,7 +379,7 @@ void Screen::shake()
// Actualiza la logica para agitar la pantalla
void Screen::updateShake()
{
if (shakeEffect.remaining > 0)
if (shakeEffect.enabled)
{
if (shakeEffect.counter > 0)
{
@@ -363,15 +388,20 @@ void Screen::updateShake()
else
{
shakeEffect.counter = shakeEffect.delay;
const auto desp = shakeEffect.remaining % 2 == 0 ? shakeEffect.desp * (-1) : shakeEffect.desp;
srcrect.x = shakeEffect.origin + desp;
const auto srcdesp = shakeEffect.remaining % 2 == 0 ? 0 : shakeEffect.desp;
const auto dstdesp = shakeEffect.remaining % 2 == 1 ? 0 : shakeEffect.desp;
srcrect.x = shakeEffect.originalPos + srcdesp;
dstrect.x = shakeEffect.originalPos + dstdesp;
shakeEffect.remaining--;
shakeEffect.enabled = shakeEffect.remaining == -1 ? false : true;
if (!shakeEffect.enabled)
{
srcrect.x = shakeEffect.originalPos;
srcrect.w = shakeEffect.originalWidth;
dstrect = srcrect;
}
}
}
else
{
srcrect.x = shakeEffect.origin;
}
}
// Pone la pantalla de color