From 332b3f52865d5953808a6f7dae99da02e8a43a20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Fri, 4 Nov 2022 11:44:20 +0100 Subject: [PATCH] Finalizada la primera parte del ending --- data/ending/ending4.png | Bin 1640 -> 1559 bytes source/ending.cpp | 117 +++++++++++++++++++++++++++++----------- source/ending.h | 31 ++++++----- 3 files changed, 103 insertions(+), 45 deletions(-) diff --git a/data/ending/ending4.png b/data/ending/ending4.png index c7cb6f7b20aef1c5dcf1f5f3adc9ec78b8fe2bb2..80fb8d9fbee4d9893b88c21761473ac401bb8be5 100644 GIT binary patch delta 1529 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 zgetOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer); - texture = resource->getTexture("ending1.png"); - sprite = new Sprite({0, 0, texture->getWidth(), texture->getHeight()}, texture, renderer); music = JA_LoadMusic(asset->get("ending1.ogg").c_str()); // Inicializa variables - counter = 0; + counter = -1; + preCounter = 0; + coverCounter = 0; section.name = SECTION_PROG_ENDING; section.subsection = 0; ticks = 0; @@ -37,17 +37,6 @@ Ending::Ending(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset // Cambia el color del borde screen->setBorderColor(stringToColor(options->palette, "black")); - // Crea la textura para el texto que se escribe en pantalla - canvasTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT); - if (canvasTexture == nullptr) - { - if (options->console) - { - std::cout << "Error: canvasTexture could not be created!\nSDL Error: " << SDL_GetError() << std::endl; - } - } - SDL_SetTextureBlendMode(canvasTexture, SDL_BLENDMODE_BLEND); - // Crea la textura para cubrir el rexto coverTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT + 8); if (coverTexture == nullptr) @@ -58,6 +47,9 @@ Ending::Ending(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset } } SDL_SetTextureBlendMode(coverTexture, SDL_BLENDMODE_BLEND); + + // Rellena la textura para la cortinilla + fillCoverTexture(); } // Destructor @@ -66,8 +58,6 @@ Ending::~Ending() // Libera la memoria de los objetos delete eventHandler; delete text; - delete sprite; - SDL_DestroyTexture(canvasTexture); SDL_DestroyTexture(coverTexture); for (auto st : spriteTexts) @@ -103,7 +93,7 @@ void Ending::update() checkEventHandler(); // Actualiza el contador - updateCounter(); + updateCounters(); // Actualiza las cortinillas de los elementos updateSpriteCovers(); @@ -136,6 +126,9 @@ void Ending::render() } } + // Dibuja la cortinilla de cambio de escena + renderCoverTexture(); + // text->write(0, 0, std::to_string(counter)); // Vuelca el contenido del renderizador en pantalla @@ -221,8 +214,8 @@ void Ending::iniTexts() // Escena #0 texts.push_back({"HE FINALLY MANAGED", 32}); - texts.push_back({"TO GET TO THE JAIL", 43}); - texts.push_back({"WITH ALL HIS PROJECTS", 141}); + texts.push_back({"TO GET TO THE JAIL", 42}); + texts.push_back({"WITH ALL HIS PROJECTS", 142}); texts.push_back({"READY TO BE RELEASED", 152}); // Escena #1 @@ -237,15 +230,15 @@ void Ending::iniTexts() // Escena #2 texts.push_back({"BUT SUDDENLY SOMETHING", 19}); - texts.push_back({"CAUGHT HIS ATTENTION", 31}); + texts.push_back({"CAUGHT HIS ATTENTION", 29}); // Escena #3 texts.push_back({"A PILE OF JUNK!", 36}); - texts.push_back({"FULL OF NON WORKING THINGS!!", 49}); + texts.push_back({"FULL OF NON WORKING THINGS!!", 46}); // Escena #4 - texts.push_back({"AND THEN,", 26}); - texts.push_back({"FOURTY NEW PROJECTS", 36}); + texts.push_back({"AND THEN,", 36}); + texts.push_back({"FOURTY NEW PROJECTS", 46}); texts.push_back({"WERE BORN...", 158}); // Crea los sprites @@ -435,7 +428,7 @@ void Ending::iniScenes() sc.textIndex.push_back({5, trigger}); trigger += lapse; sc.textIndex.push_back({6, trigger}); - trigger += lapse * 2; + trigger += lapse * 3; sc.textIndex.push_back({7, trigger}); trigger += lapse; sc.textIndex.push_back({8, trigger}); @@ -447,8 +440,8 @@ void Ending::iniScenes() sc.counterEnd = 1000; sc.pictureIndex = 2; sc.textIndex.clear(); - trigger = 148 * 2; - //trigger += lapse / 2; + trigger = 148 / 2; + trigger += lapse; sc.textIndex.push_back({10, trigger}); trigger += lapse; sc.textIndex.push_back({11, trigger}); @@ -458,10 +451,10 @@ void Ending::iniScenes() sc.counterEnd = 800; sc.pictureIndex = 3; sc.textIndex.clear(); - trigger = 87 * 2; - //trigger += lapse; + trigger = 87 / 2; + trigger += lapse; sc.textIndex.push_back({12, trigger}); - trigger += lapse/2; + trigger += lapse / 2; sc.textIndex.push_back({13, trigger}); scenes.push_back(sc); @@ -495,11 +488,23 @@ section_t Ending::run() return section; } -// Actualiza el contador -void Ending::updateCounter() +// Actualiza los contadores +void Ending::updateCounters() { // Incrementa el contador - counter++; + if (preCounter < 200) + { + preCounter++; + } + else + { + counter++; + } + + if (counter > scenes.at(scene).counterEnd - 100) + { + coverCounter++; + } } // Actualiza las cortinillas de los elementos @@ -552,9 +557,57 @@ void Ending::checkChangeScene() { scene++; counter = 0; + coverCounter = 0; if (scene == 5) { + scene = 4; section.name = SECTION_PROG_QUIT; } } +} + +// Rellena la textura para la cortinilla +void Ending::fillCoverTexture() +{ + // Rellena la textura que cubre el texto con color transparente + SDL_SetRenderTarget(renderer, coverTexture); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderClear(renderer); + + // Los primeros 8 pixels crea una malla + const color_t c = stringToColor(options->palette, "brack"); + SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 0xFF); + for (int i = 0; i < 256; i += 2) + { + SDL_RenderDrawPoint(renderer, i + 0, GAMECANVAS_HEIGHT + 0); + SDL_RenderDrawPoint(renderer, i + 1, GAMECANVAS_HEIGHT + 1); + SDL_RenderDrawPoint(renderer, i + 0, GAMECANVAS_HEIGHT + 2); + SDL_RenderDrawPoint(renderer, i + 1, GAMECANVAS_HEIGHT + 3); + + SDL_RenderDrawPoint(renderer, i, GAMECANVAS_HEIGHT + 4); + SDL_RenderDrawPoint(renderer, i, GAMECANVAS_HEIGHT + 6); + } + + // El resto se rellena de color sólido + SDL_Rect rect = {0, 0, 256, GAMECANVAS_HEIGHT}; + SDL_RenderFillRect(renderer, &rect); + + SDL_SetRenderTarget(renderer, nullptr); +} + +// Dibuja la cortinilla de cambio de escena +void Ending::renderCoverTexture() +{ + if (coverCounter > 0) + { // Dibuja la textura que cubre el texto + // const int offset = std::min(coverCounter, 200 / 2); + // SDL_Rect srcRect = {0, 0, 256, 200 - (offset * 2)}; + // SDL_Rect dstRect = {0, offset * 2, 256, 200 - (offset * 2)}; + // SDL_RenderCopy(renderer, coverTexture, &srcRect, &dstRect); + + const int offset = std::min(coverCounter, 100); + SDL_Rect srcRect = {0, 200 - (coverCounter * 2), 256, offset * 2}; + SDL_Rect dstRect = {0, 0, 256, offset * 2}; + SDL_RenderCopy(renderer, coverTexture, &srcRect, &dstRect); + } } \ No newline at end of file diff --git a/source/ending.h b/source/ending.h index eced76c..d0cb336 100644 --- a/source/ending.h +++ b/source/ending.h @@ -50,20 +50,19 @@ private: }; // Objetos y punteros - SDL_Renderer *renderer; // El renderizador de la ventana - Screen *screen; // Objeto encargado de dibujar en pantalla - Resource *resource; // Objeto con los recursos - Asset *asset; // Objeto con los ficheros de recursos - options_t *options; // Puntero a las opciones del juego - SDL_Event *eventHandler; // Manejador de eventos - Text *text; // Objeto para escribir texto en pantalla - SDL_Texture *canvasTexture; // Textura para dibujar el texto y los dibujos - SDL_Texture *coverTexture; // Textura para cubrir el texto - Texture *texture; // Textura con los graficos - Sprite *sprite; // Sprite para dibujar las imagenes + SDL_Renderer *renderer; // El renderizador de la ventana + Screen *screen; // Objeto encargado de dibujar en pantalla + Resource *resource; // Objeto con los recursos + Asset *asset; // Objeto con los ficheros de recursos + options_t *options; // Puntero a las opciones del juego + SDL_Event *eventHandler; // Manejador de eventos + Text *text; // Objeto para escribir texto en pantalla + SDL_Texture *coverTexture; // Textura para cubrir el texto // Variables int counter; // Contador + int preCounter; // Contador previo + int coverCounter; // Contador para la cortinilla section_t section; // Estado del bucle principal para saber si continua o se sale Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa @@ -91,8 +90,8 @@ private: // Inicializa las escenas void iniScenes(); - // Actualiza el contador - void updateCounter(); + // Actualiza los contadores + void updateCounters(); // Actualiza las cortinillas de los elementos void updateSpriteCovers(); @@ -100,6 +99,12 @@ private: // Comprueba si se ha de cambiar de escena void checkChangeScene(); + // Rellena la textura para la cortinilla + void fillCoverTexture(); + + // Dibuja la cortinilla de cambio de escena + void renderCoverTexture(); + public: // Constructor Ending(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options);