Añadido cambio de color en las nubes

This commit is contained in:
2024-08-30 13:12:04 +02:00
parent 1d847eae9f
commit 4f6c92c8d1
7 changed files with 189 additions and 125 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -1,11 +1,10 @@
#include "background.h"
// Constructor
Background::Background(SDL_Renderer *renderer, Screen *screen, Asset *asset, param_t *param)
Background::Background(SDL_Renderer *renderer, Asset *asset, param_t *param)
{
// Copia los punteros
this->renderer = renderer;
this->screen = screen;
this->asset = asset;
this->param = param;
@@ -22,38 +21,46 @@ Background::Background(SDL_Renderer *renderer, Screen *screen, Asset *asset, par
color = {param->backgroundAttenuateColor.r, param->backgroundAttenuateColor.g, param->backgroundAttenuateColor.b};
alphaColorText = alphaColorTextTemp = param->backgroundAttenuateAlpha;
// Carga las texturas
buildingsTexture = new Texture(renderer, asset->get("game_buildings.png"));
topCloudsTexture = new Texture(renderer, asset->get("game_clouds1.png"));
bottomCloudsTexture = new Texture(renderer, asset->get("game_clouds2.png"));
grassTexture = new Texture(renderer, asset->get("game_grass.png"));
gradientsTexture = new Texture(renderer, asset->get("game_sky_colors.png"));
gradientRect[0] = {0, 0, rect.w, rect.h};
gradientRect[1] = {rect.w, 0, rect.w, rect.h};
gradientRect[2] = {0, rect.h, rect.w, rect.h};
gradientRect[3] = {rect.w, rect.h, rect.w, rect.h};
// Carga las texturas
buildingsTexture = new Texture(renderer, asset->get("game_buildings.png"));
clouds1Texture = new Texture(renderer, asset->get("game_clouds1.png"));
clouds2Texture = new Texture(renderer, asset->get("game_clouds2.png"));
grassTexture = new Texture(renderer, asset->get("game_grass.png"));
gradientsTexture = new Texture(renderer, asset->get("game_sky_colors.png"));
const int topCloudsTextureHeight = topCloudsTexture->getHeight() / 4;
const int bottomCloudsTextureHeight = bottomCloudsTexture->getHeight() / 4;
for (int i = 0; i < 4; ++i)
{
topCloudsRect[i] = {0, i * topCloudsTextureHeight, topCloudsTexture->getWidth(), topCloudsTextureHeight};
bottomCloudsRect[i] = {0, i * bottomCloudsTextureHeight, bottomCloudsTexture->getWidth(), bottomCloudsTextureHeight};
}
// Crea los sprites
const int clouds1y = base - 165;
const int clouds2y = base - 101;
const float clouds1speed = 0.1f;
const float clouds2speed = 0.05f;
clouds1A = new MovingSprite(0, clouds1y, rect.w, clouds1Texture->getHeight(), -clouds1speed, 0.0f, 0.0f, 0.0f, clouds1Texture);
clouds1B = new MovingSprite(rect.w, clouds1y, rect.w, clouds1Texture->getHeight(), -clouds1speed, 0.0f, 0.0f, 0.0f, clouds1Texture);
topCloudsSprite_A = new MovingSprite(0, clouds1y, rect.w, topCloudsTexture->getHeight(), -clouds1speed, 0.0f, 0.0f, 0.0f, topCloudsTexture);
topCloudsSprite_B = new MovingSprite(rect.w, clouds1y, rect.w, topCloudsTexture->getHeight(), -clouds1speed, 0.0f, 0.0f, 0.0f, topCloudsTexture);
clouds2A = new MovingSprite(0, clouds2y, rect.w, clouds2Texture->getHeight(), -clouds2speed, 0.0f, 0.0f, 0.0f, clouds2Texture);
clouds2B = new MovingSprite(rect.w, clouds2y, rect.w, clouds2Texture->getHeight(), -clouds2speed, 0.0f, 0.0f, 0.0f, clouds2Texture);
bottomCloudsSprite_A = new MovingSprite(0, clouds2y, rect.w, bottomCloudsTexture->getHeight(), -clouds2speed, 0.0f, 0.0f, 0.0f, bottomCloudsTexture);
bottomCloudsSprite_B = new MovingSprite(rect.w, clouds2y, rect.w, bottomCloudsTexture->getHeight(), -clouds2speed, 0.0f, 0.0f, 0.0f, bottomCloudsTexture);
buildingsSprite = new Sprite(0, 0, buildingsTexture->getWidth(), buildingsTexture->getHeight(), buildingsTexture);
gradientSprite = new Sprite(0, 0, rect.w, rect.h, gradientsTexture);
grassSprite = new Sprite(0, 0, grassTexture->getWidth(), grassTexture->getHeight() / 2, grassTexture);
// Inicializa objetos
clouds1A->setSpriteClip(0, 0, clouds1Texture->getWidth(), clouds1Texture->getHeight());
clouds1B->setSpriteClip(0, 0, clouds1Texture->getWidth(), clouds1Texture->getHeight());
clouds2A->setSpriteClip(0, 0, clouds2Texture->getWidth(), clouds2Texture->getHeight());
clouds2B->setSpriteClip(0, 0, clouds2Texture->getWidth(), clouds2Texture->getHeight());
topCloudsSprite_A->setSpriteClip(0, 0, topCloudsTexture->getWidth(), topCloudsTexture->getHeight());
topCloudsSprite_B->setSpriteClip(0, 0, topCloudsTexture->getWidth(), topCloudsTexture->getHeight());
bottomCloudsSprite_A->setSpriteClip(0, 0, bottomCloudsTexture->getWidth(), bottomCloudsTexture->getHeight());
bottomCloudsSprite_B->setSpriteClip(0, 0, bottomCloudsTexture->getWidth(), bottomCloudsTexture->getHeight());
buildingsSprite->setPosY(base - buildingsSprite->getHeight());
grassSprite->setPosY(base - grassSprite->getHeight());
@@ -72,15 +79,15 @@ Background::Background(SDL_Renderer *renderer, Screen *screen, Asset *asset, par
Background::~Background()
{
delete buildingsTexture;
delete clouds1Texture;
delete clouds2Texture;
delete topCloudsTexture;
delete bottomCloudsTexture;
delete grassTexture;
delete gradientsTexture;
delete clouds1A;
delete clouds1B;
delete clouds2A;
delete clouds2B;
delete topCloudsSprite_A;
delete topCloudsSprite_B;
delete bottomCloudsSprite_A;
delete bottomCloudsSprite_B;
delete buildingsSprite;
delete gradientSprite;
delete grassSprite;
@@ -95,7 +102,7 @@ void Background::update()
updateAlphaColorText();
// Actualiza las nubes
updateCLouds();
updateClouds();
// Calcula el frame de la hierba
grassSprite->setSpriteClip(0, (10 * (counter / 20 % 2)), 320, 10);
@@ -109,6 +116,56 @@ void Background::update()
fillCanvas();
}
// Dibuja el gradiente de fondo
void Background::renderGradient()
{
// Dibuja el gradiente 2
gradientsTexture->setAlpha(255);
gradientSprite->setSpriteClip(gradientRect[(gradientNumber + 1) % 4]);
gradientSprite->render();
// Dibuja el gradiente 1 con una opacidad cada vez menor
gradientsTexture->setAlpha(alpha);
gradientSprite->setSpriteClip(gradientRect[gradientNumber]);
gradientSprite->render();
}
// Dibuja las nubes de arriba
void Background::renderTopClouds()
{
// Dibuja el primer conjunto de nubes
topCloudsTexture->setAlpha(255);
topCloudsSprite_A->setSpriteClip(topCloudsRect[(gradientNumber + 1) % 4]);
topCloudsSprite_A->render();
topCloudsSprite_B->setSpriteClip(topCloudsRect[(gradientNumber + 1) % 4]);
topCloudsSprite_B->render();
// Dibuja el segundo conjunto de nubes
topCloudsTexture->setAlpha(alpha);
topCloudsSprite_A->setSpriteClip(topCloudsRect[gradientNumber]);
topCloudsSprite_A->render();
topCloudsSprite_B->setSpriteClip(topCloudsRect[gradientNumber]);
topCloudsSprite_B->render();
}
// Dibuja las nubes de abajo
void Background::renderBottomClouds()
{
// Dibuja el primer conjunto de nubes
bottomCloudsTexture->setAlpha(255);
bottomCloudsSprite_A->setSpriteClip(bottomCloudsRect[(gradientNumber + 1) % 4]);
bottomCloudsSprite_A->render();
bottomCloudsSprite_B->setSpriteClip(bottomCloudsRect[(gradientNumber + 1) % 4]);
bottomCloudsSprite_B->render();
// Dibuja el segundo conjunto de nubes
bottomCloudsTexture->setAlpha(alpha);
bottomCloudsSprite_A->setSpriteClip(bottomCloudsRect[gradientNumber]);
bottomCloudsSprite_A->render();
bottomCloudsSprite_B->setSpriteClip(bottomCloudsRect[gradientNumber]);
bottomCloudsSprite_B->render();
}
// Compone todos los elementos del fondo en la textura
void Background::fillCanvas()
{
@@ -116,21 +173,14 @@ void Background::fillCanvas()
SDL_Texture *temp = SDL_GetRenderTarget(renderer);
SDL_SetRenderTarget(renderer, canvas);
// Dibuja el gradiente 2
gradientSprite->setSpriteClip(gradientRect[(gradientNumber + 1) % 4]);
gradientsTexture->setAlpha(255);
gradientSprite->render();
// Dibuja el gradiente de fondo
renderGradient();
// Dibuja el gradiente 1 con una opacidad cada vez menor
gradientSprite->setSpriteClip(gradientRect[gradientNumber]);
gradientsTexture->setAlpha(alpha);
gradientSprite->render();
// Dibuja las nubes de arriba
renderTopClouds();
// Dibuja las nubes
clouds1A->render();
clouds1B->render();
clouds2A->render();
clouds2B->render();
// Dibuja las nubes de abajo
renderBottomClouds();
// Dibuja los edificios
buildingsSprite->render();
@@ -156,8 +206,8 @@ void Background::render()
void Background::reloadTextures()
{
buildingsTexture->reLoad();
clouds1Texture->reLoad();
clouds2Texture->reLoad();
topCloudsTexture->reLoad();
bottomCloudsTexture->reLoad();
grassTexture->reLoad();
gradientsTexture->reLoad();
}
@@ -248,38 +298,38 @@ void Background::updateAlphaColorText()
}
// Actualiza las nubes
void Background::updateCLouds()
void Background::updateClouds()
{
// Aplica la velocidad calculada a las nubes
clouds1A->setVelX(cloudsSpeed);
clouds1B->setVelX(cloudsSpeed);
clouds2A->setVelX(cloudsSpeed / 2);
clouds2B->setVelX(cloudsSpeed / 2);
topCloudsSprite_A->setVelX(cloudsSpeed);
topCloudsSprite_B->setVelX(cloudsSpeed);
bottomCloudsSprite_A->setVelX(cloudsSpeed / 2);
bottomCloudsSprite_B->setVelX(cloudsSpeed / 2);
// Mueve las nubes
clouds1A->move();
clouds1B->move();
clouds2A->move();
clouds2B->move();
topCloudsSprite_A->move();
topCloudsSprite_B->move();
bottomCloudsSprite_A->move();
bottomCloudsSprite_B->move();
// Calcula el offset de las nubes
if (clouds1A->getPosX() < -clouds1A->getWidth())
if (topCloudsSprite_A->getPosX() < -topCloudsSprite_A->getWidth())
{
clouds1A->setPosX(clouds1A->getWidth());
topCloudsSprite_A->setPosX(topCloudsSprite_A->getWidth());
}
if (clouds1B->getPosX() < -clouds1B->getWidth())
if (topCloudsSprite_B->getPosX() < -topCloudsSprite_B->getWidth())
{
clouds1B->setPosX(clouds1B->getWidth());
topCloudsSprite_B->setPosX(topCloudsSprite_B->getWidth());
}
if (clouds2A->getPosX() < -clouds2A->getWidth())
if (bottomCloudsSprite_A->getPosX() < -bottomCloudsSprite_A->getWidth())
{
clouds2A->setPosX(clouds2A->getWidth());
bottomCloudsSprite_A->setPosX(bottomCloudsSprite_A->getWidth());
}
if (clouds2B->getPosX() < -clouds2B->getWidth())
if (bottomCloudsSprite_B->getPosX() < -bottomCloudsSprite_B->getWidth())
{
clouds2B->setPosX(clouds2B->getWidth());
bottomCloudsSprite_B->setPosX(bottomCloudsSprite_B->getWidth());
}
}

View File

@@ -14,7 +14,7 @@
El objeto tiene un tamaño total definido en la variable "rect". En principio este
tamaño coincide con el tamaño de la ventana o resolución del juego, pero se pinta
solo el rectangulo definido en srcRect en la posición de la pantalla definida en
solo el rectangulo definido en srcRect en la posición de la pantalla definida en
dstRect.
Utiliza varios métodos para definir su comportamiento:
@@ -44,92 +44,102 @@
class Background
{
private:
// Objetos y punteros
SDL_Renderer *renderer; // El renderizador de la ventana
Screen *screen; // Objeto encargado de dibujar en pantalla
Asset *asset; // Objeto que gestiona todos los ficheros de recursos
// Objetos y punteros
SDL_Renderer *renderer; // El renderizador de la ventana
Asset *asset; // Objeto que gestiona todos los ficheros de recursos
Texture *buildingsTexture; // Textura con los edificios de fondo
Texture *clouds1Texture; // Textura con las nubes de fondo
Texture *clouds2Texture; // Textura con las nubes de fondo
Texture *grassTexture; // Textura con la hierba del suelo
Texture *gradientsTexture; // Textura con los diferentes colores de fondo del juego
Texture *buildingsTexture; // Textura con los edificios de fondo
Texture *topCloudsTexture; // Textura con las nubes de fondo
Texture *bottomCloudsTexture; // Textura con las nubes de fondo
Texture *grassTexture; // Textura con la hierba del suelo
Texture *gradientsTexture; // Textura con los diferentes colores de fondo del juego
MovingSprite *clouds1A; // Sprite para las nubes superiores
MovingSprite *clouds1B; // Sprite para las nubes superiores
MovingSprite *clouds2A; // Sprite para las nubes inferiores
MovingSprite *clouds2B; // Sprite para las nubes inferiores
MovingSprite *topCloudsSprite_A; // Sprite para las nubes superiores
MovingSprite *topCloudsSprite_B; // Sprite para las nubes superiores
MovingSprite *bottomCloudsSprite_A; // Sprite para las nubes inferiores
MovingSprite *bottomCloudsSprite_B; // Sprite para las nubes inferiores
Sprite *buildingsSprite; // Sprite con los edificios de fondo
Sprite *gradientSprite; // Sprite con los graficos del degradado de color de fondo
Sprite *grassSprite; // Sprite para la hierba
Sprite *buildingsSprite; // Sprite con los edificios de fondo
Sprite *gradientSprite; // Sprite con los graficos del degradado de color de fondo
Sprite *grassSprite; // Sprite para la hierba
SDL_Texture *canvas; // Textura para componer el fondo
SDL_Texture *colorTexture; // Textura para atenuar el fondo
SDL_Texture *canvas; // Textura para componer el fondo
SDL_Texture *colorTexture; // Textura para atenuar el fondo
param_t *param; // Puntero con todos los parametros del programa
param_t *param; // Puntero con todos los parametros del programa
// Variables
SDL_Rect gradientRect[4]; // Vector con las coordenadas de los 4 degradados para el cielo
int gradientNumber; // Indica el número de degradado de fondo que se va a dibujar
int alpha; // Transparencia entre los dos degradados
float cloudsSpeed; // Velocidad a la que se desplazan las nubes
float transition; // Nivel de transición del fondo 0..1
int counter; // Contador interno
SDL_Rect rect; // Tamaño del objeto fondo
SDL_Rect srcRect; // Parte del objeto fondo que se va a dibujará en pantalla
SDL_Rect dstRect; // Posición donde dibujar la parte del objeto fondo que se dibujará en pantalla
int base; // Linea de fondo coincidente con el area inferior de la zona de juego
color_t color; // Color para atenuar el fondo
int alphaColorText; // Alpha para atenuar el fondo
int alphaColorTextTemp; // Valor temporal para hacer la transición de alpha
// Variables
SDL_Rect gradientRect[4]; // Vector con las coordenadas de los 4 degradados para el cielo
SDL_Rect topCloudsRect[4]; // Vector con las coordenadas de los 4 nubes de arriba
SDL_Rect bottomCloudsRect[4]; // Vector con las coordenadas de los 4 nubes de abajo
int gradientNumber; // Indica el número de degradado de fondo que se va a dibujar
int alpha; // Transparencia entre los dos degradados
float cloudsSpeed; // Velocidad a la que se desplazan las nubes
float transition; // Nivel de transición del fondo 0..1
int counter; // Contador interno
SDL_Rect rect; // Tamaño del objeto fondo
SDL_Rect srcRect; // Parte del objeto fondo que se va a dibujará en pantalla
SDL_Rect dstRect; // Posición donde dibujar la parte del objeto fondo que se dibujará en pantalla
int base; // Linea de fondo coincidente con el area inferior de la zona de juego
color_t color; // Color para atenuar el fondo
int alphaColorText; // Alpha para atenuar el fondo
int alphaColorTextTemp; // Valor temporal para hacer la transición de alpha
// Compone todos los elementos del fondo en la textura
void fillCanvas();
// Dibuja el gradiente de fondo
void renderGradient();
// Actualiza el valor de alpha
void updateAlphaColorText();
// Dibuja las nubes de arriba
void renderTopClouds();
// Actualiza las nubes
void updateCLouds();
// Dibuja las nubes de abajo
void renderBottomClouds();
// Compone todos los elementos del fondo en la textura
void fillCanvas();
// Actualiza el valor de alpha
void updateAlphaColorText();
// Actualiza las nubes
void updateClouds();
public:
// Constructor
Background(SDL_Renderer *renderer, Screen *screen, Asset *asset, param_t *param);
// Constructor
Background(SDL_Renderer *renderer, Asset *asset, param_t *param);
// Destructor
~Background();
// Destructor
~Background();
// Actualiza la lógica del objeto
void update();
// Actualiza la lógica del objeto
void update();
// Dibuja el objeto
void render();
// Dibuja el objeto
void render();
// Establece la posición del objeto
void setPos(SDL_Rect);
// Establece la posición del objeto
void setPos(SDL_Rect);
// Vuelve a cargar las texturas
void reloadTextures();
// Vuelve a cargar las texturas
void reloadTextures();
// Ajusta el valor de la variable
void setCloudsSpeed(float value);
// Ajusta el valor de la variable
void setCloudsSpeed(float value);
// Ajusta el valor de la variable
void setGradientNumber(int value);
// Ajusta el valor de la variable
void setGradientNumber(int value);
// Ajusta el valor de la variable
void setTransition(float value);
// Ajusta el valor de la variable
void setTransition(float value);
// Ajusta el valor de la variable
void setSrcRect(SDL_Rect value);
// Ajusta el valor de la variable
void setSrcRect(SDL_Rect value);
// Ajusta el valor de la variable
void setDstRect(SDL_Rect value);
// Ajusta el valor de la variable
void setDstRect(SDL_Rect value);
// Establece el color de atenuación
void setColor(color_t color);
// Establece el color de atenuación
void setColor(color_t color);
// Establece la transparencia de la atenuación
void setAlpha(int alpha);
// Establece la transparencia de la atenuación
void setAlpha(int alpha);
};

View File

@@ -156,7 +156,7 @@ void Director::initInput()
input->bindGameControllerButton(i, input_exit, SDL_CONTROLLER_BUTTON_BACK);
}
// Comprueba si ha de modificar las asignaciones por las que hay en las opciones en caso de coincidir el nombre del mando
// Mapea las asignaciones a los botones desde el archivo de configuración, si se da el caso
for (int i = 0; i < numGamePads; ++i)
for (int index = 0; index < (int)options->controller.size(); ++index)
if (input->getControllerName(i) == options->controller[index].name)

View File

@@ -25,8 +25,8 @@ Game::Game(int playerID, int currentStage, Screen *screen, Asset *asset, Lang *l
// Crea los objetos
fade = new Fade(renderer, param);
eventHandler = new SDL_Event();
scoreboard = new Scoreboard(renderer, screen, asset, lang, options);
background = new Background(renderer, screen, asset, param);
scoreboard = new Scoreboard(renderer, asset, lang, options);
background = new Background(renderer, asset, param);
explosions = new Explosions();
enemyFormations = new EnemyFormations();
@@ -2592,14 +2592,17 @@ void Game::checkEvents()
{
switch (eventHandler->key.keysym.sym)
{
// CREA UN SPRITE DE 1000 PUNTOS
case SDLK_h:
createItemScoreSprite(param->gameWidth / 2, param->gameWidth / 2, n1000Sprite);
break;
// CREA UNA POWERBALL
case SDLK_1:
createPowerBall();
break;
// CREA DOS BALLON4
case SDLK_2:
{
const int set = 0;
@@ -2617,6 +2620,7 @@ void Game::checkEvents()
}
break;
// ACTIVA EL MODO PARA PASAR EL JUEGO AUTOMATICAMENTE
case SDLK_3:
autoPopBalloons = !autoPopBalloons;
screen->showNotification("autoPopBalloons " + boolToString(autoPopBalloons));

View File

@@ -18,7 +18,7 @@ HiScoreTable::HiScoreTable(Screen *screen, Asset *asset, Input *input, Lang *lan
// Objetos
eventHandler = new SDL_Event();
fade = new Fade(renderer, param);
background = new Background(renderer, screen, asset, param);
background = new Background(renderer, asset, param);
text = new Text(asset->get("smb2.gif"), asset->get("smb2.txt"), renderer);
// Crea un backbuffer para el renderizador