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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user