Creada la clase para dibujar el fondo del juego
This commit is contained in:
167
source/background.cpp
Normal file
167
source/background.cpp
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user