diff --git a/source/ending2.cpp b/source/ending2.cpp index a899887..ca82c93 100644 --- a/source/ending2.cpp +++ b/source/ending2.cpp @@ -22,6 +22,9 @@ Ending2::Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Ass section.subsection = 0; ticks = 0; ticksSpeed = 15; + distSpriteText = 8; + distSpriteSprite = 0; + despSpeed = -0.2f; // Cambia el color del borde screen->setBorderColor(stringToColor(options->palette, "black")); @@ -31,6 +34,12 @@ Ending2::Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Ass // Carga todos los sprites desde una lista loadSprites(); + + // Coloca los sprites en su sito + placeSprites(); + + // Crea los sprites con las texturas con los textos + createSpriteTexts(); } // Destructor @@ -41,11 +50,8 @@ Ending2::~Ending2() delete text; JA_DeleteMusic(music); - for (auto sprite : sprites) - { - delete sprite; - } - sprites.clear(); + deleteSprites(); + deleteSpriteTexts(); } // Actualiza el objeto @@ -66,10 +72,8 @@ void Ending2::update() // Actualiza los sprites updateSprites(); - if (counter > 4000) - { - section.name = SECTION_PROG_LOGO; - } + // Actualiza los sprites de texto + updateTextSprites(); } } @@ -85,8 +89,11 @@ void Ending2::render() // Dibuja los sprites renderSprites(); + // Dibuja los sprites con el texto + renderSpriteTexts(); + const std::string txt = std::to_string(preCounter) + " - " + std::to_string(counter) + " - W:" + std::to_string(maxSpriteWidth) + " - H:" + std::to_string(maxSpriteHeight); - text->write(0, 192 - 8, txt); + // text->write(0, 192 - 8, txt); // Dibuja la cuadricula /*{ @@ -103,6 +110,12 @@ void Ending2::render() } }*/ + /*{ + SDL_SetRenderDrawColor(renderer, 128, 128, 128, 128); + SDL_RenderDrawLine(renderer, GAMECANVAS_FIRST_QUARTER_X, 0, GAMECANVAS_FIRST_QUARTER_X, 192); + SDL_RenderDrawLine(renderer, GAMECANVAS_THIRD_QUARTER_X, 0, GAMECANVAS_THIRD_QUARTER_X, 192); + }*/ + // Vuelca el contenido del renderizador en pantalla screen->blit(); } @@ -257,27 +270,20 @@ void Ending2::iniSpriteList() // Carga todos los sprites desde una lista void Ending2::loadSprites() { + // Borra la memoria ocupada por los sprites + deleteSprites(); + + // Inicializa variables maxSpriteWidth = 0; maxSpriteHeight = 0; + // Carga los sprites for (auto sl : spriteList) { sprites.push_back(new AnimatedSprite(renderer, resource->getAnimation(sl + ".ani"))); maxSpriteWidth = std::max(sprites.back()->getAnimationClip(0, 0).w, maxSpriteWidth); maxSpriteHeight = std::max(sprites.back()->getAnimationClip(0, 0).h, maxSpriteHeight); } - - const int sw = maxSpriteWidth + 6; - const int sh = maxSpriteHeight + 6; - for (int i = 0; i < (int)sprites.size(); ++i) - { - const int x = (i * sw) % (256 - (256 % sw)); - const int y = (i / (256 / sw)) * sh; - const int w = sprites.at(i)->getAnimationClip(0, 0).w; - const int h = sprites.at(i)->getAnimationClip(0, 0).h; - sprites.at(i)->setRect({x, y, w, h}); - sprites.at(i)->setVelY(-0.1f); - } } // Actualiza los sprites @@ -289,14 +295,23 @@ void Ending2::updateSprites() } } +// Actualiza los sprites de texto +void Ending2::updateTextSprites() +{ + for (auto &sprite : spriteTexts) + { + sprite->update(); + } +} + // Dibuja los sprites void Ending2::renderSprites() { const color_t color = stringToColor(options->palette, "red"); for (auto sprite : sprites) { - const bool a = sprite->getRect().y + sprite->getRect().h > 5; - const bool b = sprite->getRect().y < 187; + const bool a = sprite->getRect().y + sprite->getRect().h > 0; + const bool b = sprite->getRect().y < GAMECANVAS_HEIGHT; if (a && b) { sprite->getTexture()->setColor(color.r, color.g, color.b); @@ -304,4 +319,97 @@ void Ending2::renderSprites() sprite->getTexture()->setColor(255, 255, 255); } } +} + +// Dibuja los sprites con el texto +void Ending2::renderSpriteTexts() +{ + const color_t color = stringToColor(options->palette, "white"); + for (auto sprite : spriteTexts) + { + const bool a = sprite->getRect().y + sprite->getRect().h > 0; + const bool b = sprite->getRect().y < GAMECANVAS_HEIGHT; + if (a && b) + { + sprite->getTexture()->setColor(color.r, color.g, color.b); + sprite->render(); + sprite->getTexture()->setColor(255, 255, 255); + } + } +} + +// Coloca los sprites en su sito +void Ending2::placeSprites() +{ + const int sep = 16; + for (int i = 0; i < (int)sprites.size(); ++i) + { + const int x = i % 2 == 0 ? GAMECANVAS_FIRST_QUARTER_X : GAMECANVAS_THIRD_QUARTER_X; + const int y = (i / 1) * (maxSpriteHeight + distSpriteText + text->getCharacterSize() + distSpriteSprite) + GAMECANVAS_HEIGHT; + const int w = sprites.at(i)->getAnimationClip(0, 0).w; + const int h = sprites.at(i)->getAnimationClip(0, 0).h; + const int dx = -(w / 2); + const int dy = i % 1 == 0 ? maxSpriteHeight - h : (int)(maxSpriteHeight * 1.5f) - h; + + sprites.at(i)->setRect({x + dx, y + dy, w, h}); + sprites.at(i)->setVelY(despSpeed); + } +} + +// Crea los sprites con las texturas con los textos +void Ending2::createSpriteTexts() +{ + // Borra la memoria ocupada por los sprites con las texturas de los textos + deleteSpriteTexts(); + + // Crea los sprites de texto a partir de la lista + for (int i = 0; i < (int)spriteList.size(); ++i) + { + // Calcula constantes + // Texto debajo + const int w = text->lenght(spriteList.at(i), 1); + const int h = text->getCharacterSize(); + const int x = i % 2 == 0 ? GAMECANVAS_FIRST_QUARTER_X : GAMECANVAS_THIRD_QUARTER_X; + const int dx = -(w / 2); + const int y = sprites.at(i)->getPosY() + sprites.at(i)->getHeight() + distSpriteText; + + // Texto al lado + // const int w = text->lenght(spriteList.at(i), 1); + // const int h = text->getCharacterSize(); + // const int x = i % 2 == 1 ? GAMECANVAS_FIRST_QUARTER_X : GAMECANVAS_THIRD_QUARTER_X; + // const int dx = -(w / 2); + // const int y = sprites.at(i)->getPosY() + (sprites.at(i)->getHeight() / 2) - (h / 2); + + // Crea la textura + Texture *texture = new Texture(renderer); + texture->createBlank(renderer, w, h, SDL_TEXTUREACCESS_TARGET); + texture->setAsRenderTarget(renderer); + texture->setBlendMode(SDL_BLENDMODE_BLEND); + text->write(0, 0, spriteList.at(i)); + + // Crea el sprite + MovingSprite *sprite = new MovingSprite(x + dx, y, w, h, 0.0f, despSpeed, 0.0f, 0.0f, texture, renderer); + spriteTexts.push_back(sprite); + } +} + +// Borra la memoria ocupada por los sprites con las texturas de los textos +void Ending2::deleteSpriteTexts() +{ + for (auto sprite : spriteTexts) + { + delete sprite->getTexture(); + delete sprite; + } + spriteTexts.clear(); +} + +// Borra la memoria ocupada por los sprites +void Ending2::deleteSprites() +{ + for (auto sprite : sprites) + { + delete sprite; + } + sprites.clear(); } \ No newline at end of file diff --git a/source/ending2.h b/source/ending2.h index 7c6f4bb..d54c586 100644 --- a/source/ending2.h +++ b/source/ending2.h @@ -20,14 +20,15 @@ class Ending2 { private: // Objetos y punteros - Asset *asset; // Objeto con los ficheros de recursos - Resource *resource; // Objeto con los recursos - Screen *screen; // Objeto encargado de dibujar en pantalla - SDL_Event *eventHandler; // Manejador de eventos - SDL_Renderer *renderer; // El renderizador de la ventana - Text *text; // Objeto para escribir texto en pantalla - options_t *options; // Puntero a las opciones del juego - std::vector sprites; // Vector con todos los sprites a dibujar + Asset *asset; // Objeto con los ficheros de recursos + Resource *resource; // Objeto con los recursos + Screen *screen; // Objeto encargado de dibujar en pantalla + SDL_Event *eventHandler; // Manejador de eventos + SDL_Renderer *renderer; // El renderizador de la ventana + Text *text; // Objeto para escribir texto en pantalla + options_t *options; // Puntero a las opciones del juego + std::vector sprites; // Vector con todos los sprites a dibujar + std::vector spriteTexts; // Vector con los sprites de texto // Variables int counter; // Contador @@ -39,6 +40,9 @@ private: std::vector spriteList; // Lista con todos los sprites a dibujar int maxSpriteWidth; // El valor de ancho del sprite mas ancho int maxSpriteHeight; // El valor de alto del sprite mas alto + int distSpriteText; // Distancia entre el sprite y el texto que lo acompaƱa + int distSpriteSprite; // Distancia entre dos sprites de la misma columna + float despSpeed; // Velocidad de desplazamiento de los sprites // Actualiza el objeto void update(); @@ -61,9 +65,27 @@ private: // Actualiza los sprites void updateSprites(); + // Actualiza los sprites de texto + void updateTextSprites(); + // Dibuja los sprites void renderSprites(); + // Dibuja los sprites con el texto + void renderSpriteTexts(); + + // Coloca los sprites en su sito + void placeSprites(); + + // Crea los sprites con las texturas con los textos + void createSpriteTexts(); + + // Borra la memoria ocupada por los sprites con las texturas de los textos + void deleteSpriteTexts(); + + // Borra la memoria ocupada por los sprites + void deleteSprites(); + public: // Constructor Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options);