Creada la clase para dibujar el fondo del juego
This commit is contained in:
161
source/game.cpp
161
source/game.cpp
@@ -28,6 +28,7 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr
|
||||
fade = new Fade(renderer);
|
||||
eventHandler = new SDL_Event();
|
||||
scoreboard = new Scoreboard(renderer, screen, asset, lang, options);
|
||||
background = new Background(renderer, screen, asset);
|
||||
|
||||
// Carga los recursos
|
||||
loadMedia();
|
||||
@@ -38,19 +39,10 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr
|
||||
// Establece la máxima puntuación desde fichero o desde las puntuaciones online
|
||||
setHiScore();
|
||||
|
||||
clouds1A = new MovingSprite(0, 0, 256, 52, -0.4f, 0.0f, 0.0f, 0.0f, gameCloudsTexture, renderer);
|
||||
clouds1B = new MovingSprite(256, 0, 256, 52, -0.4f, 0.0f, 0.0f, 0.0f, gameCloudsTexture, renderer);
|
||||
clouds2A = new MovingSprite(0, 52, 256, 32, -0.2f, 0.0f, 0.0f, 0.0f, gameCloudsTexture, renderer);
|
||||
clouds2B = new MovingSprite(256, 52, 256, 32, -0.2f, 0.0f, 0.0f, 0.0f, gameCloudsTexture, renderer);
|
||||
|
||||
n1000Sprite = new SmartSprite(gameTextTexture, renderer);
|
||||
n2500Sprite = new SmartSprite(gameTextTexture, renderer);
|
||||
n5000Sprite = new SmartSprite(gameTextTexture, renderer);
|
||||
|
||||
buildingsSprite = new Sprite(0, 0, 256, 160, gameBuildingsTexture, renderer);
|
||||
|
||||
skyColorsSprite = new Sprite(0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT, gameSkyColorsTexture, renderer);
|
||||
grassSprite = new Sprite(0, 0, 256, 6, gameGrassTexture, renderer);
|
||||
gameOverSprite = new Sprite(16, 80, 128, 96, gameOverTexture, renderer);
|
||||
gameOverEndSprite = new Sprite(PLAY_AREA_CENTER_X - gameOverEndTexture->getWidth() / 2, 80, 128, 96, gameOverEndTexture, renderer);
|
||||
|
||||
@@ -75,18 +67,6 @@ Game::~Game()
|
||||
bulletTexture->unload();
|
||||
delete bulletTexture;
|
||||
|
||||
gameBuildingsTexture->unload();
|
||||
delete gameBuildingsTexture;
|
||||
|
||||
gameCloudsTexture->unload();
|
||||
delete gameCloudsTexture;
|
||||
|
||||
gameGrassTexture->unload();
|
||||
delete gameGrassTexture;
|
||||
|
||||
gameSkyColorsTexture->unload();
|
||||
delete gameSkyColorsTexture;
|
||||
|
||||
gameTextTexture->unload();
|
||||
delete gameTextTexture;
|
||||
|
||||
@@ -145,6 +125,7 @@ Game::~Game()
|
||||
balloonTextures.clear();
|
||||
|
||||
delete scoreboard;
|
||||
delete background;
|
||||
|
||||
delete text;
|
||||
delete textBig;
|
||||
@@ -154,17 +135,9 @@ Game::~Game()
|
||||
delete pauseMenu;
|
||||
delete fade;
|
||||
delete eventHandler;
|
||||
delete clouds1A;
|
||||
delete clouds1B;
|
||||
delete clouds2A;
|
||||
delete clouds2B;
|
||||
delete n1000Sprite;
|
||||
delete n2500Sprite;
|
||||
delete n5000Sprite;
|
||||
delete buildingsSprite;
|
||||
|
||||
delete skyColorsSprite;
|
||||
delete grassSprite;
|
||||
delete gameOverSprite;
|
||||
delete gameOverEndSprite;
|
||||
|
||||
@@ -247,7 +220,7 @@ void Game::init()
|
||||
}
|
||||
|
||||
// Variables para el marcador
|
||||
scoreboard->setPos({0, 160, 256, 32});
|
||||
scoreboard->setPos({PLAY_AREA_LEFT, PLAY_AREA_BOTTOM, PLAY_AREA_WIDTH, SCOREBOARD_HEIGHT});
|
||||
if (difficulty == DIFFICULTY_NORMAL)
|
||||
{
|
||||
scoreboard->setColor({46, 63, 71});
|
||||
@@ -332,14 +305,6 @@ void Game::init()
|
||||
// Inicializa el objeto para el fundido
|
||||
fade->init(0x27, 0x27, 0x36);
|
||||
|
||||
// Sprites
|
||||
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);
|
||||
|
||||
// Con los globos creados, calcula el nivel de amenaza
|
||||
evaluateAndSetMenace();
|
||||
|
||||
@@ -387,12 +352,6 @@ void Game::init()
|
||||
n5000Sprite->setEnabledCounter(0);
|
||||
n5000Sprite->setDestX(0);
|
||||
n5000Sprite->setDestY(0);
|
||||
|
||||
// Los fondos
|
||||
skyColorsRect[0] = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT};
|
||||
skyColorsRect[1] = {256, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT};
|
||||
skyColorsRect[2] = {0, 192, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT};
|
||||
skyColorsRect[3] = {256, 192, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT};
|
||||
}
|
||||
|
||||
// Carga los recursos necesarios para la sección 'Game'
|
||||
@@ -406,10 +365,6 @@ void Game::loadMedia()
|
||||
|
||||
// Texturas
|
||||
bulletTexture = new Texture(renderer, asset->get("bullet.png"));
|
||||
gameBuildingsTexture = new Texture(renderer, asset->get("game_buildings.png"));
|
||||
gameCloudsTexture = new Texture(renderer, asset->get("game_clouds.png"));
|
||||
gameGrassTexture = new Texture(renderer, asset->get("game_grass.png"));
|
||||
gameSkyColorsTexture = new Texture(renderer, asset->get("game_sky_colors.png"));
|
||||
gameTextTexture = new Texture(renderer, asset->get("game_text.png"));
|
||||
gameOverTexture = new Texture(renderer, asset->get("menu_game_over.png"));
|
||||
gameOverEndTexture = new Texture(renderer, asset->get("menu_game_over_end.png"));
|
||||
@@ -2704,100 +2659,31 @@ void Game::update()
|
||||
// Actualiza el fondo
|
||||
void Game::updateBackground()
|
||||
{
|
||||
if (!gameCompleted)
|
||||
{ // Si el juego no esta completo, la velocidad de las nubes es igual a los globos explotados
|
||||
cloudsSpeed = balloonsPopped;
|
||||
}
|
||||
else
|
||||
{ // Si el juego está completado, se reduce la velocidad de las nubes
|
||||
if (cloudsSpeed > 400)
|
||||
// Si el juego está completado, se reduce la velocidad de las nubes
|
||||
if (gameCompleted)
|
||||
{
|
||||
if (balloonsPopped > 400)
|
||||
{
|
||||
cloudsSpeed -= 25;
|
||||
balloonsPopped -= 25;
|
||||
}
|
||||
else
|
||||
{
|
||||
cloudsSpeed = 200;
|
||||
balloonsPopped = 200;
|
||||
}
|
||||
}
|
||||
|
||||
// Calcula la velocidad en función de los globos explotados y el total de globos a explotar para acabar el juego
|
||||
const float speed = (-0.2f) + (-3.00f * ((float)cloudsSpeed / (float)totalPowerToCompleteGame));
|
||||
const float speed = (-0.2f) + (-3.00f * ((float)balloonsPopped / (float)totalPowerToCompleteGame));
|
||||
|
||||
// Aplica la velocidad calculada a las nubes
|
||||
clouds1A->setVelX(speed);
|
||||
clouds1B->setVelX(speed);
|
||||
clouds2A->setVelX(speed / 2);
|
||||
clouds2B->setVelX(speed / 2);
|
||||
// Aplica la velocidad calculada para las nubes
|
||||
background->setCloudsSpeed(speed);
|
||||
const float gradientNumber = std::min(((float)balloonsPopped / 1250.0f), 3.0f);
|
||||
const float percent = gradientNumber - (int)gradientNumber;
|
||||
background->setGradientNumber((int)gradientNumber);
|
||||
background->setTransition(percent);
|
||||
|
||||
// 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);
|
||||
|
||||
// Mueve los edificios en funcion de si está activo el efecto de agitarlos
|
||||
if (effect.shake)
|
||||
{
|
||||
buildingsSprite->setPosX(((effect.shakeCounter % 2) * 2) - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
buildingsSprite->setPosX(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Dibuja el fondo
|
||||
void Game::renderBackground()
|
||||
{
|
||||
const float gradientNumber = std::min(((float)balloonsPopped / 1250.0f), 3.0f);
|
||||
const float percent = gradientNumber - (int)gradientNumber;
|
||||
const int alpha = std::max((255 - (int)(255 * percent)), 0);
|
||||
|
||||
// Dibuja el gradiente 2
|
||||
skyColorsSprite->setSpriteClip(skyColorsRect[((int)gradientNumber + 1) % 4]);
|
||||
gameSkyColorsTexture->setAlpha(255);
|
||||
skyColorsSprite->render();
|
||||
|
||||
// Dibuja el gradiente 1 con una opacidad cada vez menor
|
||||
skyColorsSprite->setSpriteClip(skyColorsRect[(int)gradientNumber]);
|
||||
gameSkyColorsTexture->setAlpha(alpha);
|
||||
skyColorsSprite->render();
|
||||
|
||||
// Dibuja las nubes
|
||||
clouds1A->render();
|
||||
clouds1B->render();
|
||||
clouds2A->render();
|
||||
clouds2B->render();
|
||||
|
||||
// Dinuja los edificios
|
||||
buildingsSprite->render();
|
||||
|
||||
// Dibuja la hierba
|
||||
grassSprite->render();
|
||||
// Actualiza el objeto
|
||||
background->update();
|
||||
}
|
||||
|
||||
// Dibuja la linea que separa la zona ade juego del marcador
|
||||
@@ -2805,7 +2691,7 @@ void Game::renderSeparator()
|
||||
{
|
||||
// Dibuja la linea que separa el marcador de la zona de juego
|
||||
SDL_SetRenderDrawColor(renderer, 13, 26, 43, 255);
|
||||
SDL_RenderDrawLine(renderer, 0, 160, 255, 160);
|
||||
SDL_RenderDrawLine(renderer, PLAY_AREA_LEFT, PLAY_AREA_BOTTOM, PLAY_AREA_RIGHT, PLAY_AREA_BOTTOM);
|
||||
}
|
||||
|
||||
// Dibuja el juego
|
||||
@@ -2818,7 +2704,7 @@ void Game::render()
|
||||
screen->clean(bgColor);
|
||||
|
||||
// Dibuja los objetos
|
||||
renderBackground();
|
||||
background->render();
|
||||
renderBalloons();
|
||||
renderBullets();
|
||||
renderMessages();
|
||||
@@ -3287,7 +3173,7 @@ void Game::renderPausedGame()
|
||||
|
||||
// Pinta el escenario
|
||||
{
|
||||
renderBackground();
|
||||
background->render();
|
||||
renderBalloons();
|
||||
renderBullets();
|
||||
renderMessages();
|
||||
@@ -3770,11 +3656,8 @@ void Game::reloadTextures()
|
||||
}
|
||||
|
||||
bulletTexture->reLoad();
|
||||
gameBuildingsTexture->reLoad();
|
||||
gameCloudsTexture->reLoad();
|
||||
gameGrassTexture->reLoad();
|
||||
gameSkyColorsTexture->reLoad();
|
||||
gameTextTexture->reLoad();
|
||||
background->reloadTextures();
|
||||
}
|
||||
|
||||
// Establece la máxima puntuación desde fichero o desde las puntuaciones online
|
||||
|
||||
Reference in New Issue
Block a user