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:
@@ -34,6 +34,7 @@
|
||||
#include "section.h" // for name_e, name, options, options_e
|
||||
#include "title.h" // for Title
|
||||
#include "utils.h" // for music_file_t, sound_file_t, opt...
|
||||
#include <memory>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <pwd.h> // for getpwuid, passwd
|
||||
@@ -79,9 +80,8 @@ Director::Director(int argc, char *argv[])
|
||||
loadParams(paramFilePath);
|
||||
|
||||
// Carga el fichero de puntuaciones
|
||||
ManageHiScoreTable *manager = new ManageHiScoreTable(&options.game.hiScoreTable);
|
||||
auto manager = std::make_unique<ManageHiScoreTable>(&options.game.hiScoreTable);
|
||||
manager->loadFromFile(Asset::get()->get("score.bin"));
|
||||
delete manager;
|
||||
|
||||
// Inicializa SDL
|
||||
initSDL();
|
||||
@@ -326,6 +326,7 @@ bool Director::initSDL()
|
||||
|
||||
// Establece el tamaño del buffer de renderizado
|
||||
SDL_RenderSetLogicalSize(renderer, param.game.width, param.game.height);
|
||||
SDL_RenderSetIntegerScale(renderer, SDL_TRUE);
|
||||
|
||||
// Establece el modo de mezcla
|
||||
SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
|
||||
|
||||
@@ -56,7 +56,7 @@ Game::Game(int playerID, int currentStage, bool demo, JA_Music_t *music)
|
||||
scoreboard = Scoreboard::get();
|
||||
eventHandler = std::make_unique<SDL_Event>();
|
||||
fade = std::make_unique<Fade>(renderer);
|
||||
|
||||
|
||||
background = std::make_unique<Background>(renderer);
|
||||
explosions = std::make_unique<Explosions>();
|
||||
enemyFormations = std::make_unique<EnemyFormations>();
|
||||
@@ -107,7 +107,7 @@ Game::~Game()
|
||||
unloadMedia();
|
||||
|
||||
Scoreboard::destroy();
|
||||
|
||||
|
||||
SDL_DestroyTexture(canvas);
|
||||
}
|
||||
|
||||
@@ -2655,12 +2655,14 @@ void Game::checkEvents()
|
||||
{
|
||||
switch (eventHandler->key.keysym.sym)
|
||||
{
|
||||
// CREA UNA POWERBALL
|
||||
// Crea una powerball
|
||||
case SDLK_1:
|
||||
{
|
||||
createPowerBall();
|
||||
break;
|
||||
}
|
||||
|
||||
// CREA DOS BALLON4
|
||||
// Crea dos BALLON4
|
||||
case SDLK_2:
|
||||
{
|
||||
const int set = 0;
|
||||
@@ -2678,11 +2680,27 @@ void Game::checkEvents()
|
||||
}
|
||||
break;
|
||||
|
||||
// ACTIVA EL MODO PARA PASAR EL JUEGO AUTOMATICAMENTE
|
||||
// Activa el modo para pasar el juego automaticamente
|
||||
case SDLK_3:
|
||||
{
|
||||
autoPopBalloons = !autoPopBalloons;
|
||||
screen->showNotification("autoPopBalloons " + boolToString(autoPopBalloons));
|
||||
break;
|
||||
}
|
||||
|
||||
// Ralentiza mucho la lógica
|
||||
case SDLK_4:
|
||||
{
|
||||
ticksSpeed *= 10;
|
||||
break;
|
||||
}
|
||||
|
||||
// Acelera mucho la lógica
|
||||
case SDLK_5:
|
||||
{
|
||||
ticksSpeed /= 10;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -36,7 +36,8 @@ private:
|
||||
Asset *asset; // Objeto con el listado de recursos
|
||||
Input *input; // Objeto para leer las entradas de teclado o mando
|
||||
std::unique_ptr<Notify> notify; // Pinta notificaciones en pantalla
|
||||
SDL_Texture *gameCanvas; // Textura para completar la ventana de juego hasta la pantalla completa
|
||||
SDL_Texture *gameCanvas; // Textura donde se dibuja todo antes de volcarse al renderizador
|
||||
SDL_Texture *shaderCanvas; // Textura para pasarle al shader desde gameCanvas
|
||||
|
||||
// Variables
|
||||
SDL_Rect srcrect; // Coordenadas de donde va a pillar la textura del juego para dibujarla
|
||||
@@ -62,12 +63,14 @@ private:
|
||||
|
||||
struct shake_t
|
||||
{
|
||||
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 origin; // Valor inicial de la pantalla para dejarla igual tras el desplazamiento
|
||||
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
|
||||
} shakeEffect;
|
||||
|
||||
// Actualiza la logica para agitar la pantalla
|
||||
|
||||
Reference in New Issue
Block a user