From 0a083af7126b1f5c34fbf5c55c485ebd1e4e4dbe Mon Sep 17 00:00:00 2001 From: Sergio Valor Martinez Date: Fri, 2 Dec 2022 09:35:49 +0100 Subject: [PATCH] =?UTF-8?q?El=20nombre=20de=20la=20habitaci=C3=B3n=20se=20?= =?UTF-8?q?pinta=20a=20partir=20de=20una=20textura?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/game.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++------- source/game.h | 39 ++++++++++++++++++++----------------- 2 files changed, 66 insertions(+), 24 deletions(-) diff --git a/source/game.cpp b/source/game.cpp index 8d9ab160..a741e9a0 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -42,6 +42,25 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as deathSound = JA_LoadSound(asset->get("death.wav").c_str()); stats = new Stats(asset->get("stats.csv"), asset->get("stats_buffer.csv"), options); + // Crea la textura para poner el nombre de la habitación + roomNameTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, text->getCharacterSize() * 2); + if (roomNameTexture == nullptr) + { + if (options->console) + { + std::cout << "Error: roomNameTexture could not be created!\nSDL Error: " << SDL_GetError() << std::endl; + } + } + + // Establece el blend mode de la textura + SDL_SetTextureBlendMode(roomNameTexture, SDL_BLENDMODE_BLEND); + + // Establece el destino de la textura + roomNameRect = {0, PLAY_AREA_HEIGHT, GAMECANVAS_WIDTH, text->getCharacterSize() * 2}; + + // Pone el nombre de la habitación en la textura + fillRoomNameTexture(); + // Inicializa el resto de variables ticks = 0; ticksSpeed = 15; @@ -78,6 +97,8 @@ Game::~Game() delete text; delete stats; + SDL_DestroyTexture(roomNameTexture); + JA_DeleteMusic(music); JA_DeleteSound(deathSound); } @@ -317,13 +338,8 @@ void Game::renderDebugInfo() // Escribe el nombre de la pantalla void Game::renderRoomName() { - // Texto en el centro de la pantalla - SDL_Rect rect = {0, 16 * BLOCK, PLAY_AREA_WIDTH, BLOCK * 2}; - color_t color = stringToColor(options->palette, "white"); - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF); - SDL_RenderFillRect(renderer, &rect); - - text->writeDX(TXT_CENTER | TXT_COLOR, GAMECANVAS_CENTER_X, 16 * 8 + 4, room->getName(), 1, room->getBGColor()); + // Dibuja la textura con el nombre de la habitación + SDL_RenderCopy(renderer, roomNameTexture, nullptr, &roomNameRect); } // Cambia de habitación @@ -345,6 +361,9 @@ bool Game::changeRoom(std::string file) // Crea un objeto habitación nuevo a partir del fichero room = new Room(resource->getRoom(file), renderer, screen, asset, options, itemTracker, &board.items, board.jailEnabled, debug); + // Pone el nombre de la habitación en la textura + fillRoomNameTexture(); + // Pone el color del marcador en función del color del borde de la habitación setScoreBoardColor(); @@ -636,4 +655,22 @@ void Game::initStats() } stats->init(); +} + +// Crea la textura con el nombre de la habitación +void Game::fillRoomNameTexture() +{ + // Pone la textura como destino de renderizado + SDL_SetRenderTarget(renderer, roomNameTexture); + + // Rellena la textura de color + const color_t color = stringToColor(options->palette, "white"); + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF); + SDL_RenderClear(renderer); + + // Escribe el texto en la textura + text->writeDX(TXT_CENTER | TXT_COLOR, GAMECANVAS_CENTER_X, text->getCharacterSize() / 2, room->getName(), 1, room->getBGColor()); + + // Deja el renderizador por defecto + SDL_SetRenderTarget(renderer, nullptr); } \ No newline at end of file diff --git a/source/game.h b/source/game.h index f56dec00..19bba8c0 100644 --- a/source/game.h +++ b/source/game.h @@ -26,35 +26,37 @@ class Game { private: // Objetos y punteros - SDL_Renderer *renderer; // El renderizador de la ventana - SDL_Event *eventHandler; // Manejador de eventos - Screen *screen; // Objeto encargado de manejar el renderizador - Room *room; // Objeto encargado de gestionar cada habitación del juego - Player *player; // Objeto con el jugador - ItemTracker *itemTracker; // Lleva el control de los objetos recogidos - RoomTracker *roomTracker; // Lleva el control de las habitaciones visitadas - Asset *asset; // Objeto con la ruta a todos los ficheros de recursos - Input *input; // Objeto pata gestionar la entrada - Text *text; // Objeto para los textos del juego - ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador - Resource *resource; // Objeto con los recursos - Debug *debug; // Objeto para gestionar la información de debug - options_t *options; // Puntero a las opciones del juego - Stats *stats; // Objeto encargado de gestionar las estadísticas + SDL_Renderer *renderer; // El renderizador de la ventana + SDL_Event *eventHandler; // Manejador de eventos + Screen *screen; // Objeto encargado de manejar el renderizador + Room *room; // Objeto encargado de gestionar cada habitación del juego + Player *player; // Objeto con el jugador + ItemTracker *itemTracker; // Lleva el control de los objetos recogidos + RoomTracker *roomTracker; // Lleva el control de las habitaciones visitadas + Asset *asset; // Objeto con la ruta a todos los ficheros de recursos + Input *input; // Objeto pata gestionar la entrada + Text *text; // Objeto para los textos del juego + ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador + Resource *resource; // Objeto con los recursos + Debug *debug; // Objeto para gestionar la información de debug + options_t *options; // Puntero a las opciones del juego + Stats *stats; // Objeto encargado de gestionar las estadísticas + SDL_Texture *roomNameTexture; // Textura para escribir el nombre de la habitación // Variables - JA_Music_t* music; // Musica que suena durante el juego + JA_Music_t *music; // Musica que suena durante el juego Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa section_t section; // Seccion actual dentro del juego std::string currentRoom; // Fichero de la habitación actual playerSpawn_t spawnPoint; // Lugar de la habitación donde aparece el jugador - JA_Sound_t* deathSound; // Sonido a reproducir cuando muere el jugador + JA_Sound_t *deathSound; // Sonido a reproducir cuando muere el jugador board_t board; // Estructura con los datos del marcador bool paused; // Indica si el juego se encuentra en pausa bool blackScreen; // Indica si la pantalla está en negro. Se utiliza para la muerte del jugador int blackScreenCounter; // Contador para temporizar la pantalla en negro int totalItems; // Cantidad total de items que hay en el mapeado del juego + SDL_Rect roomNameRect; // Rectangulo donde pintar la textura con el nombre de la habitación // Actualiza el juego, las variables, comprueba la entrada, etc. void update(); @@ -133,6 +135,9 @@ private: // Inicializa el diccionario de las estadísticas void initStats(); + // Pone el nombre de la habitación en la textura + void fillRoomNameTexture(); + public: // Constructor Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Input *input, Debug *debug);