Creada la clase para dibujar el fondo del juego

This commit is contained in:
2024-06-01 13:11:19 +02:00
parent b7cda085cc
commit 75a18c5306
5 changed files with 263 additions and 156 deletions

167
source/background.cpp Normal file
View File

@@ -0,0 +1,167 @@
#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;
}