diff --git a/source/director.cpp b/source/director.cpp index be91fdc..cee36e8 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -37,6 +37,9 @@ Director::Director(std::string path) mOptions->input[1].deviceType = INPUT_USE_GAMECONTROLLER; mOptions->filter = FILTER_NEAREST; mOptions->vSync = true; + mOptions->screenHeight = SCREEN_HEIGHT; + mOptions->screenWidth = SCREEN_WIDTH; + mOptions->integerScale = true; } // Crea los objetos @@ -46,7 +49,7 @@ Director::Director(std::string path) initSDL(); // Crea el objeto para dibujar en pantalla (Requiere initSDL) - mScreen = new Screen(mWindow, mRenderer); + mScreen = new Screen(mWindow, mRenderer, mOptions->screenWidth, mOptions->screenHeight, mOptions->integerScale); // Inicializa JailAudio initJailAudio(); @@ -193,7 +196,7 @@ bool Director::initSDL() SDL_SetRenderDrawColor(mRenderer, 0x00, 0x00, 0x00, 0xFF); // Establece el tamaño del buffer de renderizado - SDL_RenderSetLogicalSize(mRenderer, REAL_SCREEN_WIDTH, REAL_SCREEN_HEIGHT); + SDL_RenderSetLogicalSize(mRenderer, mOptions->screenWidth, mOptions->screenHeight); // Establece el modo de mezcla SDL_SetRenderDrawBlendMode(mRenderer, SDL_BLENDMODE_BLEND); @@ -357,13 +360,16 @@ bool Director::loadConfigFile() { // Pone unos valores por defecto mOptions->fullScreenMode = 0; - mOptions->windowSize = 3; + mOptions->windowSize = 1; mOptions->language = en_UK; mOptions->difficulty = DIFFICULTY_NORMAL; mOptions->input[0].deviceType = INPUT_USE_KEYBOARD; mOptions->input[1].deviceType = INPUT_USE_GAMECONTROLLER; mOptions->filter = FILTER_NEAREST; mOptions->vSync = true; + mOptions->screenHeight = 480; + mOptions->screenWidth = 640; + mOptions->integerScale = true; // Indicador de éxito en la carga bool success = true; @@ -392,6 +398,9 @@ bool Director::loadConfigFile() SDL_RWwrite(file, &mOptions->input[1].deviceType, sizeof(mOptions->input[1].deviceType), 1); SDL_RWwrite(file, &mOptions->filter, sizeof(mOptions->filter), 1); SDL_RWwrite(file, &mOptions->vSync, sizeof(mOptions->vSync), 1); + SDL_RWwrite(file, &mOptions->screenHeight, sizeof(mOptions->screenHeight), 1); + SDL_RWwrite(file, &mOptions->screenWidth, sizeof(mOptions->screenWidth), 1); + SDL_RWwrite(file, &mOptions->integerScale, sizeof(mOptions->integerScale), 1); // Cierra el fichero SDL_RWclose(file); @@ -415,6 +424,9 @@ bool Director::loadConfigFile() SDL_RWread(file, &mOptions->input[1].deviceType, sizeof(mOptions->input[1].deviceType), 1); SDL_RWread(file, &mOptions->filter, sizeof(mOptions->filter), 1); SDL_RWread(file, &mOptions->vSync, sizeof(mOptions->vSync), 1); + SDL_RWread(file, &mOptions->screenHeight, sizeof(mOptions->screenHeight), 1); + SDL_RWread(file, &mOptions->screenWidth, sizeof(mOptions->screenWidth), 1); + SDL_RWread(file, &mOptions->integerScale, sizeof(mOptions->integerScale), 1); // Normaliza los valores if (!((mOptions->fullScreenMode == 0) || @@ -451,6 +463,9 @@ bool Director::saveConfigFile() SDL_RWwrite(file, &mOptions->input[1].deviceType, sizeof(mOptions->input[1].deviceType), 1); SDL_RWwrite(file, &mOptions->filter, sizeof(mOptions->filter), 1); SDL_RWwrite(file, &mOptions->vSync, sizeof(mOptions->vSync), 1); + SDL_RWwrite(file, &mOptions->screenHeight, sizeof(mOptions->screenHeight), 1); + SDL_RWwrite(file, &mOptions->screenWidth, sizeof(mOptions->screenWidth), 1); + SDL_RWwrite(file, &mOptions->integerScale, sizeof(mOptions->integerScale), 1); printf("Writing file %s\n", filename.c_str()); diff --git a/source/screen.cpp b/source/screen.cpp index 69bc28c..2e6d871 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -2,18 +2,33 @@ #include "const.h" // Constructor -Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) +Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, int screenWidth, int screenHeight, bool integerScale) { // Inicializa variables mWindow = window; mRenderer = renderer; - mScreenWidth = REAL_SCREEN_WIDTH; - mScreenHeight = REAL_SCREEN_HEIGHT; + mScreenWidth = screenWidth; + mScreenHeight = screenHeight; mGameCanvasWidth = SCREEN_WIDTH; mGameCanvasHeight = SCREEN_HEIGHT; mGameCanvasPosX = (mScreenWidth - mGameCanvasWidth) / 2; mGameCanvasPosY = (mScreenHeight - mGameCanvasHeight) / 2; + mIntegerScale = integerScale; + + // Calcula el tamaño de la escala máxima + mScale = 0; + int width = mGameCanvasWidth; + int height = mGameCanvasHeight; + while (((width * (mScale + 1)) < mScreenWidth) && ((height * (mScale + 1)) < mScreenHeight)) + { + mScale++; + } + + width = width * mScale; + height = height * mScale; + mGameCanvasPosX = (mScreenWidth - width) / 2; + mGameCanvasPosY = (mScreenHeight - height) / 2; mBorderColor = {0x27, 0x27, 0x36}; mBorderColor = {0x00, 0x00, 0x00}; @@ -54,7 +69,7 @@ void Screen::blit() SDL_RenderClear(mRenderer); // Rectangulo de destino donde se dibujarà la textura con el juego - SDL_Rect dest = {mGameCanvasPosX, mGameCanvasPosY, mGameCanvasWidth, mGameCanvasHeight}; + SDL_Rect dest = {mGameCanvasPosX, mGameCanvasPosY, mGameCanvasWidth*mScale, mGameCanvasHeight*mScale}; // Copia la textura de juego en el renderizador en la posición adecuada SDL_RenderCopy(mRenderer, mGameCanvas, NULL, &dest); diff --git a/source/screen.h b/source/screen.h index 45bfef1..a63774b 100644 --- a/source/screen.h +++ b/source/screen.h @@ -19,12 +19,14 @@ private: int mGameCanvasHeight; // Alto de la textura donde se dibuja el juego int mGameCanvasPosX; // Posicion en el eje X donde se dibujará la textura del juego dentro de la pantalla int mGameCanvasPosY; // Posicion en el eje Y donde se dibujará la textura del juego dentro de la pantalla + bool mIntegerScale; // Indica si la textura se escala en multiplos enteros + Uint8 mScale; // Contiene el valor por el cual se multiplica el GameCanvas para aprovechar el maximo de pantalla color_t mBorderColor; // Color del borde añadido a la textura de juego para rellenar la pantalla public: // Constructor - Screen(SDL_Window *windows, SDL_Renderer *renderer); + Screen(SDL_Window *windows, SDL_Renderer *renderer, int screenWidth, int screenHeight, bool integerScale = false); // Destructor ~Screen(); diff --git a/source/title.cpp b/source/title.cpp index 3e60203..7b1d06f 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -517,7 +517,7 @@ void Title::updateMenuLabels() void Title::applyOptions() { SDL_SetWindowFullscreen(mWindow, mOptions->fullScreenMode); - SDL_SetWindowSize(mWindow, SCREEN_WIDTH * mOptions->windowSize, SCREEN_HEIGHT * mOptions->windowSize); + SDL_SetWindowSize(mWindow, mOptions->screenWidth * mOptions->windowSize, mOptions->screenHeight * mOptions->windowSize); mLang->setLang(mOptions->language); updateMenuLabels(); diff --git a/source/utils.h b/source/utils.h index 4b5191b..0d21654 100644 --- a/source/utils.h +++ b/source/utils.h @@ -64,9 +64,12 @@ struct options_t input_t input[2]; // Modo de control (teclado o mando) Uint8 language; // Idioma usado en el juego Uint32 fullScreenMode; // Contiene el valor del modo de pantalla completa - Uint8 windowSize; // Contiene el valor del tamaño de la ventana + Uint8 windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana Uint32 filter; // Filtro usado para el escalado de la imagen bool vSync; // Indica si se quiere usar vsync o no + int screenWidth; // Ancho de la pantalla/ventana + int screenHeight; // Alto de la pantalla/ventana + bool integerScale; // Indica si el escalado de la imagen ha de ser entero }; // Calcula el cuadrado de la distancia entre dos puntos