Retocada y vuelta a añadir la hierba al fondo

This commit is contained in:
2024-07-12 15:37:33 +02:00
parent 55638e2997
commit 6609021488
7 changed files with 200 additions and 69 deletions

View File

@@ -19,6 +19,8 @@ Background::Background(SDL_Renderer *renderer, Screen *screen, Asset *asset, par
srcRect = {playArea.x, rect.h - playArea.h, playArea.w, playArea.h};
dstRect = {0, 0, playArea.w, playArea.h};
base = rect.h;
color = {param->backgroundAttenuateColor.r, param->backgroundAttenuateColor.g, param->backgroundAttenuateColor.b};
alphaColorText = alphaColorTextTemp = param->backgroundAttenuateAlpha;
gradientRect[0] = {0, 0, rect.w, rect.h};
gradientRect[1] = {rect.w, 0, rect.w, rect.h};
@@ -40,7 +42,7 @@ Background::Background(SDL_Renderer *renderer, Screen *screen, Asset *asset, par
buildingsSprite = new Sprite(0, 0, rect.w, 135, buildingsTexture, renderer);
gradientSprite = new Sprite(0, 0, rect.w, rect.h, gradientsTexture, renderer);
grassSprite = new Sprite(0, 0, 256, 6, grassTexture, renderer);
grassSprite = new Sprite(0, 0, 320, 10, grassTexture, renderer);
// Inicializa objetos
clouds1A->setSpriteClip(0, 0, cloudsTexture->getWidth(), 52);
@@ -53,6 +55,12 @@ Background::Background(SDL_Renderer *renderer, Screen *screen, Asset *asset, par
// Crea la textura para componer el fondo
canvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, rect.w, rect.h);
SDL_SetTextureBlendMode(canvas, SDL_BLENDMODE_BLEND);
// Crea la textura para atenuar el fondo
colorText = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, rect.w, rect.h);
SDL_SetTextureBlendMode(colorText, SDL_BLENDMODE_BLEND);
setColor(color);
SDL_SetTextureAlphaMod(colorText, alphaColorText);
}
// Destructor
@@ -78,52 +86,28 @@ Background::~Background()
delete gradientSprite;
delete grassSprite;
SDL_DestroyTexture(canvas);
SDL_DestroyTexture(colorText);
}
// 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);
// Actualiza el valor de alpha
updateAlphaColorText();
// 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());
}
// Actualiza las nubes
updateCLouds();
// Calcula el frame de la hierba
grassSprite->setSpriteClip(0, (6 * (counter / 20 % 2)), 256, 6);
grassSprite->setSpriteClip(0, (10 * (counter / 20 % 2)), 320, 10);
// Calcula el valor de alpha
alpha = std::max((255 - (int)(255 * transition)), 0);
// Incrementa el contador
counter++;
fillCanvas();
}
// Compone todos los elementos del fondo en la textura
@@ -153,7 +137,7 @@ void Background::fillCanvas()
buildingsSprite->render();
// Dibuja la hierba
//grassSprite->render();
grassSprite->render();
// Deja el renderizador apuntando donde estaba
SDL_SetRenderTarget(renderer, temp);
@@ -162,8 +146,11 @@ void Background::fillCanvas()
// Dibuja el objeto
void Background::render()
{
fillCanvas();
// Fondo
SDL_RenderCopy(renderer, canvas, &srcRect, &dstRect);
// Atenuación
SDL_RenderCopy(renderer, colorText, &srcRect, &dstRect);
}
// Vuelve a cargar las texturas
@@ -213,4 +200,80 @@ void Background::setSrcDest(SDL_Rect value)
void Background::setDstDest(SDL_Rect value)
{
dstRect = value;
}
// Establece el color de atenuación
void Background::setColor(color_t color)
{
this->color = color;
// Colorea la textura
SDL_Texture *temp = SDL_GetRenderTarget(renderer);
SDL_SetRenderTarget(renderer, colorText);
SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, temp);
}
// Establece la transparencia de la atenuación
void Background::setAlpha(int alpha)
{
// Guarda el valor actual
alphaColorTextTemp = alphaColorText;
// Establece el nuevo valor
alphaColorText = alpha;
}
// Actualiza el valor de alpha
void Background::updateAlphaColorText()
{
if (alphaColorText == alphaColorTextTemp)
{
return;
}
else
{
alphaColorText > alphaColorTextTemp ? alphaColorTextTemp++ : alphaColorTextTemp--;
SDL_SetTextureAlphaMod(colorText, alphaColorTextTemp);
}
}
// Actualiza las nubes
void Background::updateCLouds()
{
// 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());
}
}