#include "screen.h" #include "const.h" // Constructor Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, options_t *options) { // Inicializa variables mWindow = window; mRenderer = renderer; mOptions = options; mScreenWidth = mOptions->screenWidth; mScreenHeight = mOptions->screenHeight; mGameCanvasWidth = SCREEN_WIDTH; mGameCanvasHeight = SCREEN_HEIGHT; mDest.x = (mScreenWidth - mGameCanvasWidth) / 2; mDest.y = (mScreenHeight - mGameCanvasHeight) / 2; mIntegerScale = mOptions->integerScale; //mIntegerScale = true; /* Si el juego es en pantalla completa, calcular la resolución del escritorio y ponerla a las variables con un método nuevo. Si el juego es en ventana, se aplica el gamecanvas multiplicado por el window size, para jugar sin bordes Hacer método setRes(w,h) */ // Calcula el tamaño de la escala máxima int scale = 0; while (((mGameCanvasWidth * (scale + 1)) <= mScreenWidth) && ((mGameCanvasHeight * (scale + 1)) <= mScreenHeight)) { scale++; } if (mIntegerScale) { mDest.w = mGameCanvasWidth * scale; mDest.h = mGameCanvasHeight * scale; mDest.x = (mScreenWidth - mDest.w) / 2; mDest.y = (mScreenHeight - mDest.h) / 2; } else { mDest.w = mScreenWidth; mDest.h = mScreenHeight; mDest.x = mDest.y = 0; } if (mOptions->fullScreenMode == 0) { mOptions->screenWidth = mScreenWidth = mGameCanvasWidth; mOptions->screenHeight = mScreenHeight = mGameCanvasHeight; } 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 == NULL) 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, NULL); // 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, NULL, &mDest); // Muestra por pantalla el renderizador SDL_RenderPresent(mRenderer); }