#include "background.h" // Constructor Background::Background(SDL_Renderer *renderer, Screen *screen, Asset *asset) { // Copia los punteros this->renderer = renderer; this->screen = screen; this->asset = asset; // Carga las texturas buildingsTexture = new Texture(renderer, asset->get("game_buildings.png")); cloudsTexture = new Texture(renderer, asset->get("game_clouds.png")); grassTexture = new Texture(renderer, asset->get("game_grass.png")); gradientsTexture = new Texture(renderer, asset->get("game_sky_colors.png")); // Crea los sprites clouds1A = new MovingSprite(0, 0, 256, 52, -0.4f, 0.0f, 0.0f, 0.0f, cloudsTexture, renderer); clouds1B = new MovingSprite(256, 0, 256, 52, -0.4f, 0.0f, 0.0f, 0.0f, cloudsTexture, renderer); clouds2A = new MovingSprite(0, 52, 256, 32, -0.2f, 0.0f, 0.0f, 0.0f, cloudsTexture, renderer); clouds2B = new MovingSprite(256, 52, 256, 32, -0.2f, 0.0f, 0.0f, 0.0f, cloudsTexture, renderer); buildingsSprite = new Sprite(0, 0, 256, 160, buildingsTexture, renderer); gradientSprite = new Sprite(0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT, gradientsTexture, renderer); grassSprite = new Sprite(0, 0, 256, 6, grassTexture, renderer); // Inicializa variables clouds1A->setSpriteClip(0, 0, 256, 52); clouds1B->setSpriteClip(0, 0, 256, 52); clouds2A->setSpriteClip(0, 52, 256, 32); clouds2B->setSpriteClip(0, 52, 256, 32); grassSprite->setPosY(154); gradientRect[0] = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT}; gradientRect[1] = {256, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT}; gradientRect[2] = {0, 192, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT}; gradientRect[3] = {256, 192, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT}; gradientNumber = 0; alpha = 0; cloudsSpeed = 0; transition = 0; counter = 0; } // Destructor Background::~Background() { buildingsTexture->unload(); delete buildingsTexture; cloudsTexture->unload(); delete cloudsTexture; grassTexture->unload(); delete grassTexture; gradientsTexture->unload(); delete gradientsTexture; delete clouds1A; delete clouds1B; delete clouds2A; delete clouds2B; delete buildingsSprite; delete gradientSprite; delete grassSprite; } // Actualiza la lógica del objeto void Background::update() { // Aplica la velocidad calculada a las nubes clouds1A->setVelX(cloudsSpeed); clouds1B->setVelX(cloudsSpeed); clouds2A->setVelX(cloudsSpeed / 2); clouds2B->setVelX(cloudsSpeed / 2); // Mueve las nubes clouds1A->move(); clouds1B->move(); clouds2A->move(); clouds2B->move(); // Calcula el offset de las nubes if (clouds1A->getPosX() < -clouds1A->getWidth()) { clouds1A->setPosX(clouds1A->getWidth()); } if (clouds1B->getPosX() < -clouds1B->getWidth()) { clouds1B->setPosX(clouds1B->getWidth()); } if (clouds2A->getPosX() < -clouds2A->getWidth()) { clouds2A->setPosX(clouds2A->getWidth()); } if (clouds2B->getPosX() < -clouds2B->getWidth()) { clouds2B->setPosX(clouds2B->getWidth()); } // Calcula el frame de la hierba grassSprite->setSpriteClip(0, (6 * (counter / 20 % 2)), 256, 6); // Calcula el valor de alpha alpha = std::max((255 - (int)(255 * transition)), 0); // Incrementa el contador counter++; } // Dibuja el objeto void Background::render() { // Dibuja el gradiente 2 gradientSprite->setSpriteClip(gradientRect[(gradientNumber + 1) % 4]); gradientsTexture->setAlpha(255); gradientSprite->render(); // Dibuja el gradiente 1 con una opacidad cada vez menor gradientSprite->setSpriteClip(gradientRect[gradientNumber]); gradientsTexture->setAlpha(alpha); gradientSprite->render(); // Dibuja las nubes clouds1A->render(); clouds1B->render(); clouds2A->render(); clouds2B->render(); // Dibuja los edificios buildingsSprite->render(); // Dibuja la hierba grassSprite->render(); } // Vuelve a cargar las texturas void Background::reloadTextures() { buildingsTexture->reLoad(); cloudsTexture->reLoad(); grassTexture->reLoad(); gradientsTexture->reLoad(); } // Ajusta el valor de la variable void Background::setCloudsSpeed(float value) { cloudsSpeed = value; } // Ajusta el valor de la variable void Background::setGradientNumber(int value) { gradientNumber = value % 4; } // Ajusta el valor de la variable void Background::setTransition(float value) { transition = value; }