Muntat a c++14 per a make_unique

Mes autos, const i constexpr perl codi
Ara la classe Screen es un poc pitjor
This commit is contained in:
2024-10-06 14:58:00 +02:00
parent 25a2753b13
commit afe092c742
16 changed files with 290 additions and 381 deletions

View File

@@ -12,6 +12,7 @@
#include "input.h" // for Input, inputs_e, INPUT_DO_NOT_ALLOW_REPEAT
#include "notify.h" // for Notify
#include "options.h" // for options
#include "param.h"
#include "on_screen_help.h"
#include "global_inputs.h"
@@ -48,10 +49,8 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) : window(window), ren
asset = Asset::get();
// Inicializa variables
SDL_GetRendererOutputSize(renderer, &windowWidth, &windowHeight);
gameCanvasWidth = options.video.gameWidth;
gameCanvasHeight = options.video.gameHeight;
dest = {0, 0, 0, 0};
srcrect = {0, 0, param.game.width, param.game.height};
dstrect = {0, 0, param.game.width, param.game.height};
borderColor = {0, 0, 0};
flashEffect.enabled = false;
flashEffect.counter = 0;
@@ -77,13 +76,13 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) : window(window), ren
infoResolution = std::to_string(DM.w) + " X " + std::to_string(DM.h) + " AT " + std::to_string(DM.refresh_rate) + " HZ";
// Crea los objetos
notify = new Notify(renderer, "", asset->get("8bithud.png"), asset->get("8bithud.txt"), asset->get("notify.wav"));
notify = std::make_unique<Notify>(renderer, "", asset->get("8bithud.png"), asset->get("8bithud.txt"), asset->get("notify.wav"));
// 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
gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, gameCanvasWidth, gameCanvasHeight);
gameCanvas = 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,7 +94,6 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) : window(window), ren
// Destructor
Screen::~Screen()
{
delete notify;
SDL_DestroyTexture(gameCanvas);
}
@@ -142,7 +140,7 @@ void Screen::blit()
SDL_RenderClear(renderer);
// Copia la textura de juego en el renderizador en la posición adecuada
SDL_RenderCopy(renderer, gameCanvas, nullptr, &dest);
SDL_RenderCopy(renderer, gameCanvas, nullptr, nullptr);
// Muestra por pantalla el renderizador
SDL_RenderPresent(renderer);
@@ -156,12 +154,8 @@ void Screen::blit()
// Vuelve a dejar el renderizador en modo normal
SDL_SetRenderTarget(renderer, nullptr);
// Borra el contenido previo
SDL_SetRenderDrawColor(renderer, borderColor.r, borderColor.g, borderColor.b, 0xFF);
SDL_RenderClear(renderer);
// Copia la textura de juego en el renderizador en la posición adecuada
SDL_RenderCopy(renderer, gameCanvas, nullptr, &dest);
SDL_RenderCopy(renderer, gameCanvas, &srcrect, nullptr);
// Muestra por pantalla el renderizador
SDL_RenderPresent(renderer);
@@ -170,17 +164,18 @@ void Screen::blit()
}
// Establece el modo de video
void Screen::setVideoMode(int videoMode)
void Screen::setVideoMode(screenVideoMode videoMode)
{
options.video.mode = videoMode;
#ifdef ARCADE
videoMode = SCREEN_VIDEO_MODE_WINDOW;
// videoMode = SCREEN_VIDEO_MODE_FULLSCREEN;
options.video.mode = screenVideoMode::WINDOW;
#endif
// Si está activo el modo ventana quita el borde
if (videoMode == SCREEN_VIDEO_MODE_WINDOW)
switch (options.video.mode)
{
// Aplica el modo de video
case screenVideoMode::WINDOW:
{
// Cambia a modo de ventana
SDL_SetWindowFullscreen(window, 0);
#ifdef ARCADE
@@ -190,86 +185,29 @@ void Screen::setVideoMode(int videoMode)
// Muestra el puntero
SDL_ShowCursor(SDL_ENABLE);
#endif
windowWidth = gameCanvasWidth;
windowHeight = gameCanvasHeight;
dest = {0, 0, windowWidth, windowHeight};
// Modifica el tamaño de la ventana
SDL_SetWindowSize(window, windowWidth * options.video.window.size, windowHeight * options.video.window.size);
SDL_SetWindowSize(window, param.game.width * options.video.window.size, param.game.height * options.video.window.size);
SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
break;
}
// Si está activo el modo de pantalla completa añade el borde
else if (videoMode == SCREEN_VIDEO_MODE_FULLSCREEN)
case screenVideoMode::FULLSCREEN:
{
// Aplica el modo de video
SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);
#ifdef ARCADE
/*SDL_DisplayMode DM;
DM.w = 1024;
DM.h = 600;
DM.refresh_rate = 60;
if (!SDL_SetWindowDisplayMode(window, &DM))
{
std::cout << SDL_GetError() << std::endl;
}
else
{
std::cout << "Changed windows display mode" << std::endl;
}*/
#endif
// Oculta el puntero
SDL_ShowCursor(SDL_DISABLE);
// Obten el alto y el ancho de la ventana
// SDL_GetWindowSize(window, &windowWidth, &windowHeight);
// Aplica el escalado al rectangulo donde se pinta la textura del juego
if (options.video.integerScale)
{
// Calcula el tamaño de la escala máxima
int scale = 0;
while (((gameCanvasWidth * (scale + 1)) <= windowWidth) && ((gameCanvasHeight * (scale + 1)) <= windowHeight))
{
scale++;
}
dest.w = gameCanvasWidth * scale;
dest.h = gameCanvasHeight * scale;
dest.x = (windowWidth - dest.w) / 2;
dest.y = (windowHeight - dest.h) / 2;
}
else if (options.video.keepAspect)
{
float ratio = (float)gameCanvasWidth / (float)gameCanvasHeight;
if ((windowWidth - gameCanvasWidth) >= (windowHeight - gameCanvasHeight))
{
dest.h = windowHeight;
dest.w = (int)((windowHeight * ratio) + 0.5f);
dest.x = (windowWidth - dest.w) / 2;
dest.y = (windowHeight - dest.h) / 2;
}
else
{
dest.w = windowWidth;
dest.h = (int)((windowWidth / ratio) + 0.5f);
dest.x = (windowWidth - dest.w) / 2;
dest.y = (windowHeight - dest.h) / 2;
}
}
else
{
// dest = {0, 0, windowWidth, windowHeight};
dest = {0, 0, gameCanvasWidth, gameCanvasHeight};
}
break;
}
default:
break;
}
#ifdef NO_SHADERS
// El renderizador pasa a tener el tamaño de la pantalla en fullscreen o del juego en modo ventana
SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight);
#else
// Reinicia los shaders
if (options.video.shaders)
{
@@ -279,28 +217,14 @@ void Screen::setVideoMode(int videoMode)
shader::init(window, gameCanvas, source.c_str());
}
// Modifica el tamaño del renderizador
else
{
// El renderizador pasa a tener el tamaño de la pantalla en fullscreen o del juego en modo ventana
// SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight);
SDL_RenderSetLogicalSize(renderer, gameCanvasWidth, gameCanvasHeight);
}
#endif
// Actualiza las opciones
options.video.mode = videoMode;
options.video.window.width = windowWidth;
options.video.window.height = windowHeight;
// Actualiza variables
shakeEffect.origin = dest.x;
shakeEffect.origin = srcrect.x;
}
// Camibia entre pantalla completa y ventana
void Screen::switchVideoMode()
{
options.video.mode = options.video.mode == SCREEN_VIDEO_MODE_WINDOW ? SCREEN_VIDEO_MODE_FULLSCREEN : SCREEN_VIDEO_MODE_WINDOW;
options.video.mode = options.video.mode == screenVideoMode::WINDOW ? screenVideoMode::FULLSCREEN : screenVideoMode::WINDOW;
setVideoMode(options.video.mode);
}
@@ -308,7 +232,7 @@ void Screen::switchVideoMode()
void Screen::setWindowSize(int size)
{
options.video.window.size = size;
setVideoMode(SCREEN_VIDEO_MODE_WINDOW);
setVideoMode(screenVideoMode::WINDOW);
}
// Reduce el tamaño de la ventana
@@ -316,7 +240,7 @@ void Screen::decWindowSize()
{
--options.video.window.size;
options.video.window.size = std::max(options.video.window.size, 1);
setVideoMode(SCREEN_VIDEO_MODE_WINDOW);
setVideoMode(screenVideoMode::WINDOW);
}
// Aumenta el tamaño de la ventana
@@ -324,7 +248,7 @@ void Screen::incWindowSize()
{
++options.video.window.size;
options.video.window.size = std::min(options.video.window.size, 4);
setVideoMode(SCREEN_VIDEO_MODE_WINDOW);
setVideoMode(screenVideoMode::WINDOW);
}
// Cambia el color del borde
@@ -356,7 +280,7 @@ void Screen::checkInput()
if (input->checkInput(input_window_fullscreen, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_KEYBOARD))
{
switchVideoMode();
const std::string mode = options.video.mode == SCREEN_VIDEO_MODE_WINDOW ? "Window" : "Fullscreen";
const std::string mode = options.video.mode == screenVideoMode::WINDOW ? "Window" : "Fullscreen";
showNotification(mode + " mode");
return;
}
@@ -420,7 +344,7 @@ 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)
{
shakeEffect.origin = dest.x;
shakeEffect.origin = srcrect.x;
}
shakeEffect.remaining = shakeEffect.lenght;
@@ -439,14 +363,14 @@ void Screen::updateShake()
else
{
shakeEffect.counter = shakeEffect.delay;
const int desp = shakeEffect.remaining % 2 == 0 ? shakeEffect.desp * (-1) : shakeEffect.desp;
dest.x = shakeEffect.origin + desp;
const auto desp = shakeEffect.remaining % 2 == 0 ? shakeEffect.desp * (-1) : shakeEffect.desp;
srcrect.x = shakeEffect.origin + desp;
shakeEffect.remaining--;
}
}
else
{
dest.x = shakeEffect.origin;
srcrect.x = shakeEffect.origin;
}
}
@@ -534,7 +458,7 @@ void Screen::displayInfo()
{
// FPS
const std::string fpstext = std::to_string(fps) + " FPS";
dbg_print(gameCanvasWidth - fpstext.length() * 8, 0, fpstext.c_str(), 255, 255, 0);
dbg_print(param.game.width - fpstext.length() * 8, 0, fpstext.c_str(), 255, 255, 0);
// Resolution
dbg_print(0, 0, infoResolution.c_str(), 255, 255, 0);