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

@@ -46,19 +46,18 @@ class Background
private: private:
// Objetos y punteros // Objetos y punteros
SDL_Renderer *renderer; // El renderizador de la ventana 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 Asset *asset; // Objeto que gestiona todos los ficheros de recursos
Texture *buildingsTexture; // Textura con los edificios de fondo Texture *buildingsTexture; // Textura con los edificios de fondo
Texture *clouds1Texture; // Textura con las nubes de fondo Texture *topCloudsTexture; // Textura con las nubes de fondo
Texture *clouds2Texture; // Textura con las nubes de fondo Texture *bottomCloudsTexture; // Textura con las nubes de fondo
Texture *grassTexture; // Textura con la hierba del suelo Texture *grassTexture; // Textura con la hierba del suelo
Texture *gradientsTexture; // Textura con los diferentes colores de fondo del juego Texture *gradientsTexture; // Textura con los diferentes colores de fondo del juego
MovingSprite *clouds1A; // Sprite para las nubes superiores MovingSprite *topCloudsSprite_A; // Sprite para las nubes superiores
MovingSprite *clouds1B; // Sprite para las nubes superiores MovingSprite *topCloudsSprite_B; // Sprite para las nubes superiores
MovingSprite *clouds2A; // Sprite para las nubes inferiores MovingSprite *bottomCloudsSprite_A; // Sprite para las nubes inferiores
MovingSprite *clouds2B; // Sprite para las nubes inferiores MovingSprite *bottomCloudsSprite_B; // Sprite para las nubes inferiores
Sprite *buildingsSprite; // Sprite con los edificios de fondo Sprite *buildingsSprite; // Sprite con los edificios de fondo
Sprite *gradientSprite; // Sprite con los graficos del degradado de color de fondo Sprite *gradientSprite; // Sprite con los graficos del degradado de color de fondo
@@ -71,6 +70,8 @@ private:
// Variables // Variables
SDL_Rect gradientRect[4]; // Vector con las coordenadas de los 4 degradados para el cielo 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 gradientNumber; // Indica el número de degradado de fondo que se va a dibujar
int alpha; // Transparencia entre los dos degradados int alpha; // Transparencia entre los dos degradados
float cloudsSpeed; // Velocidad a la que se desplazan las nubes float cloudsSpeed; // Velocidad a la que se desplazan las nubes
@@ -84,6 +85,15 @@ private:
int alphaColorText; // Alpha para atenuar el fondo int alphaColorText; // Alpha para atenuar el fondo
int alphaColorTextTemp; // Valor temporal para hacer la transición de alpha int alphaColorTextTemp; // Valor temporal para hacer la transición de alpha
// Dibuja el gradiente de fondo
void renderGradient();
// Dibuja las nubes de arriba
void renderTopClouds();
// Dibuja las nubes de abajo
void renderBottomClouds();
// Compone todos los elementos del fondo en la textura // Compone todos los elementos del fondo en la textura
void fillCanvas(); void fillCanvas();
@@ -91,11 +101,11 @@ private:
void updateAlphaColorText(); void updateAlphaColorText();
// Actualiza las nubes // Actualiza las nubes
void updateCLouds(); void updateClouds();
public: public:
// Constructor // Constructor
Background(SDL_Renderer *renderer, Screen *screen, Asset *asset, param_t *param); Background(SDL_Renderer *renderer, Asset *asset, param_t *param);
// Destructor // Destructor
~Background(); ~Background();

View File

@@ -156,7 +156,7 @@ void Director::initInput()
input->bindGameControllerButton(i, input_exit, SDL_CONTROLLER_BUTTON_BACK); 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 i = 0; i < numGamePads; ++i)
for (int index = 0; index < (int)options->controller.size(); ++index) for (int index = 0; index < (int)options->controller.size(); ++index)
if (input->getControllerName(i) == options->controller[index].name) 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 // Crea los objetos
fade = new Fade(renderer, param); fade = new Fade(renderer, param);
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
scoreboard = new Scoreboard(renderer, screen, asset, lang, options); scoreboard = new Scoreboard(renderer, asset, lang, options);
background = new Background(renderer, screen, asset, param); background = new Background(renderer, asset, param);
explosions = new Explosions(); explosions = new Explosions();
enemyFormations = new EnemyFormations(); enemyFormations = new EnemyFormations();
@@ -2592,14 +2592,17 @@ void Game::checkEvents()
{ {
switch (eventHandler->key.keysym.sym) switch (eventHandler->key.keysym.sym)
{ {
// CREA UN SPRITE DE 1000 PUNTOS
case SDLK_h: case SDLK_h:
createItemScoreSprite(param->gameWidth / 2, param->gameWidth / 2, n1000Sprite); createItemScoreSprite(param->gameWidth / 2, param->gameWidth / 2, n1000Sprite);
break; break;
// CREA UNA POWERBALL
case SDLK_1: case SDLK_1:
createPowerBall(); createPowerBall();
break; break;
// CREA DOS BALLON4
case SDLK_2: case SDLK_2:
{ {
const int set = 0; const int set = 0;
@@ -2617,6 +2620,7 @@ void Game::checkEvents()
} }
break; break;
// ACTIVA EL MODO PARA PASAR EL JUEGO AUTOMATICAMENTE
case SDLK_3: case SDLK_3:
autoPopBalloons = !autoPopBalloons; autoPopBalloons = !autoPopBalloons;
screen->showNotification("autoPopBalloons " + boolToString(autoPopBalloons)); screen->showNotification("autoPopBalloons " + boolToString(autoPopBalloons));

View File

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