From 850b4e2a123e69e2bebbdf64687ef4151ef7834b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Wed, 8 Sep 2021 23:12:08 +0200 Subject: [PATCH] Trabajando en la clase screen. Ya pone borde en la pantalla --- source/const.h | 8 ++++++-- source/director.cpp | 6 +++--- source/game.cpp | 11 ++++++++--- source/game.h | 2 +- source/screen.cpp | 26 +++++++++++++++++++++++++- source/screen.h | 11 ++++++++++- 6 files changed, 53 insertions(+), 11 deletions(-) diff --git a/source/const.h b/source/const.h index afa119e..c2674b9 100644 --- a/source/const.h +++ b/source/const.h @@ -15,12 +15,16 @@ #define HALF_BLOCK 4 // Tamaño de la pantalla real +#define REAL_SCREEN_WIDTH 320 +#define REAL_SCREEN_HEIGHT 240 + +// Tamaño de la pantalla virtual #define SCREEN_WIDTH 256 #define SCREEN_HEIGHT 192 // Tamaño de la pantalla que se muestra -const int VIEW_WIDTH = SCREEN_WIDTH * 3; -const int VIEW_HEIGHT = SCREEN_HEIGHT * 3; +const int VIEW_WIDTH = REAL_SCREEN_WIDTH * 3; +const int VIEW_HEIGHT = REAL_SCREEN_HEIGHT * 3; // Zona de juego const int PLAY_AREA_TOP = (0 * BLOCK); diff --git a/source/director.cpp b/source/director.cpp index ff44267..5834c14 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -49,7 +49,7 @@ Director::Director(std::string path) // Aplica las opciones SDL_SetWindowFullscreen(mWindow, mOptions->fullScreenMode); - SDL_SetWindowSize(mWindow, SCREEN_WIDTH * mOptions->windowSize, SCREEN_HEIGHT * mOptions->windowSize); + SDL_SetWindowSize(mWindow, REAL_SCREEN_WIDTH * mOptions->windowSize, REAL_SCREEN_HEIGHT * mOptions->windowSize); mLang->setLang(mOptions->language); // Inicializa el resto de variables @@ -172,7 +172,7 @@ bool Director::initSDL() SDL_SetRenderDrawColor(mRenderer, 0x00, 0x00, 0x00, 0xFF); // Establece el tamaño del buffer de renderizado - SDL_RenderSetLogicalSize(mRenderer, SCREEN_WIDTH, SCREEN_HEIGHT); + SDL_RenderSetLogicalSize(mRenderer, REAL_SCREEN_WIDTH, REAL_SCREEN_HEIGHT); // Establece el modo de mezcla SDL_SetRenderDrawBlendMode(mRenderer, SDL_BLENDMODE_BLEND); @@ -352,7 +352,7 @@ void Director::runTitle() void Director::runGame() { - mGame = new Game(mRenderer, mAsset, mLang, mInput); + mGame = new Game(mWindow, mRenderer, mAsset, mLang, mInput); setSection(mGame->run()); delete mGame; } diff --git a/source/game.cpp b/source/game.cpp index bc1ac00..1ae6f71 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -1,7 +1,7 @@ #include "game.h" // Constructor -Game::Game(SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input) +Game::Game(SDL_Window *window,SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input) { // Copia los punteros mRenderer = renderer; @@ -9,7 +9,7 @@ Game::Game(SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input) mLang = lang; mInput = input; - mScreen = new Screen(renderer); + mScreen = new Screen(window, renderer); mEventHandler = new SDL_Event(); mTextureText = new LTexture(); mText = new Text(mAsset->get("nokia2.txt"), mTextureText, renderer); @@ -95,7 +95,12 @@ section_t Game::run() // Limpia la pantalla mScreen->clean(); - mText->writeCentered(SCREEN_CENTER_X, SCREEN_CENTER_Y, "Pepe el Cazavampiros", 0); + // Medidas de ancho y alto de la pantalla + mText->writeCentered(SCREEN_CENTER_X, 0, std::to_string(SCREEN_WIDTH), -1); + mText->write(0, SCREEN_CENTER_Y - (mText->getCharacterWidth() / 2), std::to_string(SCREEN_HEIGHT), -1); + + // Texto en el centro de la pantalla + mText->writeCentered(SCREEN_CENTER_X, SCREEN_CENTER_Y - (mText->getCharacterWidth() / 2), "Pepe el Cazavampiros", -1); // Actualiza la pantalla mScreen->blit(); diff --git a/source/game.h b/source/game.h index 8d95492..ff26e47 100644 --- a/source/game.h +++ b/source/game.h @@ -45,7 +45,7 @@ private: public: // Constructor - Game(SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input); + Game(SDL_Window *window,SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input); // Destructor ~Game(); diff --git a/source/screen.cpp b/source/screen.cpp index 6207a83..fcc3f62 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -1,9 +1,22 @@ #include "screen.h" +#include "const.h" // Constructor -Screen::Screen(SDL_Renderer *renderer) +Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) { + mWindow = window; mRenderer = renderer; + + mRealScreenWidth = REAL_SCREEN_WIDTH; + mRealScreenHeight = REAL_SCREEN_HEIGHT; + mScreenWidth = SCREEN_WIDTH; + mScreenHeight = SCREEN_HEIGHT; + mBorderX = (REAL_SCREEN_WIDTH - SCREEN_WIDTH) / 2; + mBorderY = (REAL_SCREEN_HEIGHT - SCREEN_HEIGHT) / 2; + + mGameCanvas = SDL_CreateTexture(mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, SCREEN_WIDTH, SCREEN_HEIGHT); + if (mGameCanvas == NULL) + printf("TitleSurface could not be created!\nSDL Error: %s\n", SDL_GetError()); } // Destructor @@ -15,6 +28,10 @@ Screen::~Screen() // Limpia la pantalla void Screen::clean() { + SDL_SetRenderDrawColor(mRenderer, 0x27, 0x27, 0x36, 0xFF); + SDL_RenderClear(mRenderer); + + SDL_SetRenderTarget(mRenderer, mGameCanvas); SDL_SetRenderDrawColor(mRenderer, 0xAA, 0x44, 0x44, 0xFF); SDL_RenderClear(mRenderer); } @@ -22,5 +39,12 @@ void Screen::clean() // Vuelca el contenido del renderizador en pantalla void Screen::blit() { + SDL_Rect src = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; + SDL_Rect dest = {mBorderX, mBorderY, SCREEN_WIDTH, SCREEN_HEIGHT}; + + SDL_SetRenderTarget(mRenderer, NULL); + + SDL_RenderCopy(mRenderer, mGameCanvas, NULL, &dest); + SDL_RenderPresent(mRenderer); } \ No newline at end of file diff --git a/source/screen.h b/source/screen.h index 4b145c5..6785d2a 100644 --- a/source/screen.h +++ b/source/screen.h @@ -8,11 +8,20 @@ class Screen { private: + SDL_Window *mWindow; // Ventana de la aplicación SDL_Renderer *mRenderer; // El renderizador de la ventana + SDL_Texture *mGameCanvas; // Textura para completar la ventana de juego hasta la pantalla completa + + int mRealScreenWidth; + int mRealScreenHeight; + int mScreenWidth; + int mScreenHeight; + int mBorderX; + int mBorderY; public: // Constructor - Screen(SDL_Renderer *renderer); + Screen(SDL_Window *windows, SDL_Renderer *renderer); // Destructor ~Screen();