diff --git a/data/ending/ending4.png b/data/ending/ending4.png index dad2d38..c7cb6f7 100644 Binary files a/data/ending/ending4.png and b/data/ending/ending4.png differ diff --git a/source/common/sprite.cpp b/source/common/sprite.cpp index e5a1104..1a49a41 100644 --- a/source/common/sprite.cpp +++ b/source/common/sprite.cpp @@ -138,7 +138,14 @@ void Sprite::setSpriteClip(SDL_Rect rect) // Establece el valor de la variable void Sprite::setSpriteClip(int x, int y, int w, int h) { - spriteClip = {x, y, w, h}; + if (w == -1 || h == -1) + { + spriteClip = {x, y, this->w, this->h}; + } + else + { + spriteClip = {x, y, w, h}; + } } // Obten el valor de la variable diff --git a/source/common/texture.cpp b/source/common/texture.cpp index 0c96e92..79e0b92 100644 --- a/source/common/texture.cpp +++ b/source/common/texture.cpp @@ -198,4 +198,10 @@ int Texture::getHeight() bool Texture::reLoad() { return loadFromFile(path, renderer); +} + +// Obtiene la textura +SDL_Texture *Texture::getSDLTexture() +{ + return texture; } \ No newline at end of file diff --git a/source/common/texture.h b/source/common/texture.h index 487e2a8..d83d7e2 100644 --- a/source/common/texture.h +++ b/source/common/texture.h @@ -58,6 +58,9 @@ public: // Recarga la textura bool reLoad(); + + // Obtiene la textura + SDL_Texture *getSDLTexture(); }; #endif diff --git a/source/ending.cpp b/source/ending.cpp index 234c612..26279e9 100644 --- a/source/ending.cpp +++ b/source/ending.cpp @@ -69,6 +69,14 @@ Ending::~Ending() delete sprite; SDL_DestroyTexture(canvasTexture); SDL_DestroyTexture(coverTexture); + + for (auto st : spriteTexts) + { + delete st.coverTexture; + delete st.sprite; + delete st.texture; + } + spriteTexts.clear(); } // Actualiza el objeto @@ -100,13 +108,26 @@ void Ending::render() screen->start(); // Limpia la pantalla - screen->clean(); + screen->clean(stringToColor(options->palette, "green")); // Dibuja la canvasTexture - SDL_RenderCopy(renderer, canvasTexture, nullptr, nullptr); + // SDL_RenderCopy(renderer, canvasTexture, nullptr, nullptr); // Dibuja la coverTexture - renderCoverTexture(); + // renderCoverTexture(); + + if (scene == 0) + { + spriteTexts.at(0).sprite->render(); + spriteTexts.at(1).sprite->render(); + spriteTexts.at(2).sprite->render(); + spriteTexts.at(3).sprite->render(); + + spriteTexts.at(0).coverSprite->render(); + spriteTexts.at(1).coverSprite->render(); + spriteTexts.at(2).coverSprite->render(); + spriteTexts.at(3).coverSprite->render(); + } // Vuelca el contenido del renderizador en pantalla screen->blit(); @@ -239,14 +260,54 @@ void Ending::iniTexts() endingTexture_t st; const int width = text->lenght(t.caption, 1) + 2 + 2; const int height = text->getCharacterSize() + 2 + 2; - const color_t c = stringToColor(options->palette, "black"); + color_t c = stringToColor(options->palette, "black"); + + // Crea la texture st.texture = new Texture(renderer); st.texture->createBlank(renderer, width, height, SDL_TEXTUREACCESS_TARGET); st.texture->setAsRenderTarget(renderer); st.texture->setBlendMode(SDL_BLENDMODE_BLEND); text->writeDX(TXT_STROKE, 2, 2, t.caption, 1, c, 2, c); + + // Crea el sprite st.sprite = new Sprite({0, 0, st.texture->getWidth(), st.texture->getHeight()}, st.texture, renderer); st.sprite->setPos({(GAMECANVAS_WIDTH - st.texture->getWidth()) / 2, t.pos}); + + // Crea la coverTexture + st.coverTexture = new Texture(renderer); + st.coverTexture->createBlank(renderer, width, height + 8, SDL_TEXTUREACCESS_TARGET); + st.coverTexture->setAsRenderTarget(renderer); + st.coverTexture->setBlendMode(SDL_BLENDMODE_BLEND); + + // Rellena la coverTexture con color transparente + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); + SDL_RenderClear(renderer); + + // Los primeros 8 pixels crea una malla + c = stringToColor(options->palette, "red"); + SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 0xFF); + for (int i = 0; i < width; i += 2) + { + SDL_RenderDrawPoint(renderer, i, 0); + SDL_RenderDrawPoint(renderer, i, 2); + SDL_RenderDrawPoint(renderer, i, 4); + SDL_RenderDrawPoint(renderer, i, 6); + + SDL_RenderDrawPoint(renderer, i + 1, 5); + SDL_RenderDrawPoint(renderer, i + 1, 7); + } + + // El resto se rellena de color sólido + SDL_Rect rect = {0, 8, width, height}; + c = stringToColor(options->palette, "cyan"); + SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 0xFF); + SDL_RenderFillRect(renderer, &rect); + + // Crea el sprite + st.coverSprite = new Sprite({0, 0, st.coverTexture->getWidth(), st.coverTexture->getHeight() - 8}, st.coverTexture, renderer); + st.coverSprite->setPos({(GAMECANVAS_WIDTH - st.coverTexture->getWidth()) / 2, t.pos}); + st.coverSprite->setSpriteClip(0, 8, -1, -1); + spriteTexts.push_back(st); } } @@ -439,6 +500,19 @@ void Ending::updateCounter() if (counterEnabled) { counter++; + + { + /*for (auto st : spriteTexts) + { + const int height = st.sprite->getHeight() + 8; + const int width = st.sprite->getWidth(); + const int offset = std::min(counter / 8, height / 2); + SDL_Rect srcRect = {0, 0, width, height - (offset * 2)}; + SDL_Rect dstRect = {0, (offset * 2) - 8, width, height - (offset * 2)}; + st.texture->setAsRenderTarget(renderer); + SDL_RenderCopy(renderer, st.coverTexture->getSDLTexture(), &srcRect, &dstRect); + }*/ + } } else { diff --git a/source/ending.h b/source/ending.h index 6067bf0..10b8df3 100644 --- a/source/ending.h +++ b/source/ending.h @@ -24,6 +24,8 @@ private: { Texture *texture; Sprite *sprite; + Texture *coverTexture; + Sprite *coverSprite; }; struct textAndPos_t