#include "screen.h" #include "const.h" #include #include // Constructor Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, options_t *options) { // Inicializa variables mWindow = window; mRenderer = renderer; mOptions = options; mGameCanvasWidth = SCREEN_WIDTH; mGameCanvasHeight = SCREEN_HEIGHT; // Establece el modo de video setVideoMode(mOptions->fullScreenMode); // Define el color del borde para el modo de pantalla completa mBorderColor = {0x27, 0x27, 0x36}; mBorderColor = {0x00, 0x00, 0x00}; // Crea la textura donde se dibujan los graficos del juego mGameCanvas = SDL_CreateTexture(mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, mGameCanvasWidth, mGameCanvasHeight); if (mGameCanvas == nullptr) printf("TitleSurface could not be created!\nSDL Error: %s\n", SDL_GetError()); } // Destructor Screen::~Screen() { mRenderer = nullptr; } // Limpia la pantalla void Screen::clean(color_t color) { SDL_SetRenderDrawColor(mRenderer, color.r, color.g, color.b, 0xFF); SDL_RenderClear(mRenderer); } // Prepara para empezar a dibujar en la textura de juego void Screen::start() { SDL_SetRenderTarget(mRenderer, mGameCanvas); } // Vuelca el contenido del renderizador en pantalla void Screen::blit() { // Vuelve a dejar el renderizador en modo normal SDL_SetRenderTarget(mRenderer, nullptr); // Borra el contenido previo SDL_SetRenderDrawColor(mRenderer, mBorderColor.r, mBorderColor.g, mBorderColor.b, 0xFF); SDL_RenderClear(mRenderer); // Copia la textura de juego en el renderizador en la posición adecuada SDL_RenderCopy(mRenderer, mGameCanvas, nullptr, &mDest); // Muestra por pantalla el renderizador SDL_RenderPresent(mRenderer); } // Establece el modo de video void Screen::setVideoMode(int fullScreenMode) { // Aplica el modo de video SDL_SetWindowFullscreen(mWindow, fullScreenMode); // Si está activo el modo ventana quita el borde if (fullScreenMode == 0) { mScreenWidth = mGameCanvasWidth; mScreenHeight = mGameCanvasHeight; mDest = {0, 0, mGameCanvasWidth, mGameCanvasHeight}; // Modifica el tamaño del renderizador y de la ventana SDL_RenderSetLogicalSize(mRenderer, mScreenWidth, mScreenHeight); SDL_SetWindowSize(mWindow, mScreenWidth * mOptions->windowSize, mScreenHeight * mOptions->windowSize); } // Si está activo el modo de pantalla completa añade el borde if (fullScreenMode == SDL_WINDOW_FULLSCREEN_DESKTOP) { // Obten el alto y el ancho de la ventana SDL_GetWindowSize(mWindow, &mScreenWidth, &mScreenHeight); // Aplica el escalado al rectangulo donde se pinta la textura del juego if (mOptions->integerScale) { // Calcula el tamaño de la escala máxima int scale = 0; while (((mGameCanvasWidth * (scale + 1)) <= mScreenWidth) && ((mGameCanvasHeight * (scale + 1)) <= mScreenHeight)) { scale++; } mDest.w = mGameCanvasWidth * scale; mDest.h = mGameCanvasHeight * scale; mDest.x = (mScreenWidth - mDest.w) / 2; mDest.y = (mScreenHeight - mDest.h) / 2; } else if (mOptions->keepAspect) { float ratio = (float)mGameCanvasWidth / (float)mGameCanvasHeight; if ((mScreenWidth - mGameCanvasWidth) >= (mScreenHeight - mGameCanvasHeight)) { mDest.h = mScreenHeight; mDest.w = (int)((mScreenHeight * ratio) + 0.5f); mDest.x = (mScreenWidth - mDest.w) / 2; mDest.y = (mScreenHeight - mDest.h) / 2; } else { mDest.w = mScreenWidth; mDest.h = (int)((mScreenWidth / ratio) + 0.5f); mDest.x = (mScreenWidth - mDest.w) / 2; mDest.y = (mScreenHeight - mDest.h) / 2; } } else { mDest.w = mScreenWidth; mDest.h = mScreenHeight; mDest.x = mDest.y = 0; } // Modifica el tamaño del renderizador SDL_RenderSetLogicalSize(mRenderer, mScreenWidth, mScreenHeight); } }