Afegits roidets de colisió per als globos per a certs moments
This commit is contained in:
@@ -5,6 +5,8 @@
|
|||||||
#include "param.h" // Para Param, param, ParamBalloon, ParamGame
|
#include "param.h" // Para Param, param, ParamBalloon, ParamGame
|
||||||
#include "sprite.h" // Para Sprite
|
#include "sprite.h" // Para Sprite
|
||||||
#include "texture.h" // Para Texture
|
#include "texture.h" // Para Texture
|
||||||
|
#include "resource.h"
|
||||||
|
#include "jail_audio.h"
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
Balloon::Balloon(float x, float y, BalloonType type, BalloonSize size, float vel_x, float speed, Uint16 creation_timer, SDL_Rect play_area, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation)
|
Balloon::Balloon(float x, float y, BalloonType type, BalloonSize size, float vel_x, float speed, Uint16 creation_timer, SDL_Rect play_area, std::shared_ptr<Texture> texture, const std::vector<std::string> &animation)
|
||||||
@@ -36,6 +38,7 @@ Balloon::Balloon(float x, float y, BalloonType type, BalloonSize size, float vel
|
|||||||
power_ = BALLOON_POWER[index];
|
power_ = BALLOON_POWER[index];
|
||||||
menace_ = BALLOON_MENACE[index];
|
menace_ = BALLOON_MENACE[index];
|
||||||
score_ = BALLOON_SCORE[index];
|
score_ = BALLOON_SCORE[index];
|
||||||
|
sound_ = BALLOON_SOUND[index];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -50,14 +53,16 @@ Balloon::Balloon(float x, float y, BalloonType type, BalloonSize size, float vel
|
|||||||
power_ = BALLOON_POWER[index];
|
power_ = BALLOON_POWER[index];
|
||||||
menace_ = BALLOON_MENACE[index];
|
menace_ = BALLOON_MENACE[index];
|
||||||
score_ = BALLOON_SCORE[index];
|
score_ = BALLOON_SCORE[index];
|
||||||
|
sound_ = BALLOON_SOUND[index];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case BalloonType::POWERBALL:
|
case BalloonType::POWERBALL:
|
||||||
{
|
{
|
||||||
const int index = 3;
|
constexpr int index = 3;
|
||||||
h_ = w_ = BALLOON_SIZE[4];
|
h_ = w_ = BALLOON_SIZE[4];
|
||||||
|
sound_ = BALLOON_SOUND[3];
|
||||||
power_ = score_ = menace_ = 0;
|
power_ = score_ = menace_ = 0;
|
||||||
|
|
||||||
vy_ = 0;
|
vy_ = 0;
|
||||||
@@ -145,6 +150,7 @@ void Balloon::move()
|
|||||||
const float max_x = play_area_.x + play_area_.w - w_ + clip;
|
const float max_x = play_area_.x + play_area_.w - w_ + clip;
|
||||||
if (x_ < min_x || x_ > max_x)
|
if (x_ < min_x || x_ > max_x)
|
||||||
{
|
{
|
||||||
|
playSound();
|
||||||
x_ = std::clamp(x_, min_x, max_x);
|
x_ = std::clamp(x_, min_x, max_x);
|
||||||
vx_ = -vx_;
|
vx_ = -vx_;
|
||||||
// Activa el efecto de rebote o invierte la rotación
|
// Activa el efecto de rebote o invierte la rotación
|
||||||
@@ -179,6 +185,7 @@ void Balloon::move()
|
|||||||
const int min_y = play_area_.y;
|
const int min_y = play_area_.y;
|
||||||
if (y_ < min_y)
|
if (y_ < min_y)
|
||||||
{
|
{
|
||||||
|
playSound();
|
||||||
y_ = min_y;
|
y_ = min_y;
|
||||||
vy_ = -vy_;
|
vy_ = -vy_;
|
||||||
enableBounce();
|
enableBounce();
|
||||||
@@ -189,6 +196,7 @@ void Balloon::move()
|
|||||||
const int max_y = play_area_.y + play_area_.h - h_;
|
const int max_y = play_area_.y + play_area_.h - h_;
|
||||||
if (y_ > max_y)
|
if (y_ > max_y)
|
||||||
{
|
{
|
||||||
|
playSound();
|
||||||
y_ = max_y;
|
y_ = max_y;
|
||||||
vy_ = -default_vy_;
|
vy_ = -default_vy_;
|
||||||
if (type_ != BalloonType::POWERBALL)
|
if (type_ != BalloonType::POWERBALL)
|
||||||
@@ -401,4 +409,13 @@ void Balloon::useNormalColor()
|
|||||||
{
|
{
|
||||||
use_reversed_colors_ = false;
|
use_reversed_colors_ = false;
|
||||||
setAnimation();
|
setAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reproduce el sonido al rebotar
|
||||||
|
void Balloon::playSound()
|
||||||
|
{
|
||||||
|
if (sound_enabled_)
|
||||||
|
{
|
||||||
|
JA_PlaySound(Resource::get()->getSound(sound_));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -17,6 +17,7 @@ constexpr int BALLOON_SCORE[] = {50, 100, 200, 400};
|
|||||||
constexpr int BALLOON_POWER[] = {1, 3, 7, 15};
|
constexpr int BALLOON_POWER[] = {1, 3, 7, 15};
|
||||||
constexpr int BALLOON_MENACE[] = {1, 2, 4, 8};
|
constexpr int BALLOON_MENACE[] = {1, 2, 4, 8};
|
||||||
constexpr int BALLOON_SIZE[] = {10, 16, 26, 48, 49};
|
constexpr int BALLOON_SIZE[] = {10, 16, 26, 48, 49};
|
||||||
|
const std::string BALLOON_SOUND[] = {"bubble1.wav", "bubble2.wav", "bubble3.wav", "bubble4.wav"};
|
||||||
|
|
||||||
// Tamaños de globo
|
// Tamaños de globo
|
||||||
enum class BalloonSize : Uint8
|
enum class BalloonSize : Uint8
|
||||||
@@ -113,6 +114,8 @@ private:
|
|||||||
float speed_; // Velocidad a la que se mueven los globos
|
float speed_; // Velocidad a la que se mueven los globos
|
||||||
Uint8 power_; // Cantidad de poder que alberga el globo
|
Uint8 power_; // Cantidad de poder que alberga el globo
|
||||||
SDL_Rect play_area_; // Zona por donde se puede mover el globo
|
SDL_Rect play_area_; // Zona por donde se puede mover el globo
|
||||||
|
std::string sound_; // Archivo de sonido que hace el globo al rebotar
|
||||||
|
bool sound_enabled_ = false; // Indica si ha de sonar el sonido del globo al rebotar
|
||||||
|
|
||||||
// Alinea el circulo de colisión con la posición del objeto globo
|
// Alinea el circulo de colisión con la posición del objeto globo
|
||||||
void shiftColliders();
|
void shiftColliders();
|
||||||
@@ -138,6 +141,9 @@ private:
|
|||||||
// Establece la animación correspondiente
|
// Establece la animación correspondiente
|
||||||
void setAnimation();
|
void setAnimation();
|
||||||
|
|
||||||
|
// Reproduce el sonido al rebotar
|
||||||
|
void playSound();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Constructor
|
// Constructor
|
||||||
Balloon(
|
Balloon(
|
||||||
@@ -208,4 +214,5 @@ public:
|
|||||||
void setVelY(float vel_y) { vy_ = vel_y; }
|
void setVelY(float vel_y) { vy_ = vel_y; }
|
||||||
void setSpeed(float speed) { speed_ = speed; }
|
void setSpeed(float speed) { speed_ = speed; }
|
||||||
void setInvulnerable(bool value) { invulnerable_ = value; }
|
void setInvulnerable(bool value) { invulnerable_ = value; }
|
||||||
|
void setSound(bool value) { sound_enabled_ = value; }
|
||||||
};
|
};
|
||||||
@@ -371,4 +371,13 @@ int BalloonManager::getMenace()
|
|||||||
{
|
{
|
||||||
return std::accumulate(balloons_.begin(), balloons_.end(), 0, [](int sum, const auto &balloon)
|
return std::accumulate(balloons_.begin(), balloons_.end(), 0, [](int sum, const auto &balloon)
|
||||||
{ return sum + (balloon->isEnabled() ? balloon->getMenace() : 0); });
|
{ return sum + (balloon->isEnabled() ? balloon->getMenace() : 0); });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Establece el sonido de los globos
|
||||||
|
void BalloonManager::setSounds(bool value)
|
||||||
|
{
|
||||||
|
for (auto &balloon : balloons_)
|
||||||
|
{
|
||||||
|
balloon->setSound(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -111,6 +111,9 @@ public:
|
|||||||
// Obtiene el nivel de ameza actual generado por los globos
|
// Obtiene el nivel de ameza actual generado por los globos
|
||||||
int getMenace();
|
int getMenace();
|
||||||
|
|
||||||
|
// Establece el sonido de los globos
|
||||||
|
void setSounds(bool value);
|
||||||
|
|
||||||
// Getters
|
// Getters
|
||||||
float getBalloonSpeed() const { return balloon_speed_; }
|
float getBalloonSpeed() const { return balloon_speed_; }
|
||||||
Balloons &getBalloons() { return balloons_; }
|
Balloons &getBalloons() { return balloons_; }
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ Director::Director(int argc, const char *argv[])
|
|||||||
section::name = section::Name::GAME;
|
section::name = section::Name::GAME;
|
||||||
section::options = section::Options::GAME_PLAY_1P;
|
section::options = section::Options::GAME_PLAY_1P;
|
||||||
#elif DEBUG
|
#elif DEBUG
|
||||||
section::name = section::Name::LOGO;
|
section::name = section::Name::GAME;
|
||||||
#else // NORMAL GAME
|
#else // NORMAL GAME
|
||||||
section::name = section::Name::LOGO;
|
section::name = section::Name::LOGO;
|
||||||
section::attract_mode = section::AttractMode::TITLE_TO_DEMO;
|
section::attract_mode = section::AttractMode::TITLE_TO_DEMO;
|
||||||
|
|||||||
@@ -283,10 +283,15 @@ void Game::updateGameOverState()
|
|||||||
if (game_over_counter_ > 0)
|
if (game_over_counter_ > 0)
|
||||||
{
|
{
|
||||||
if (game_over_counter_ == GAME_OVER_COUNTER_)
|
if (game_over_counter_ == GAME_OVER_COUNTER_)
|
||||||
|
{
|
||||||
createMessage({paths_.at(2), paths_.at(3)}, Resource::get()->getTexture("game_over"));
|
createMessage({paths_.at(2), paths_.at(3)}, Resource::get()->getTexture("game_over"));
|
||||||
|
stopMusic();
|
||||||
|
balloon_manager_->setSounds(true);
|
||||||
|
}
|
||||||
|
|
||||||
game_over_counter_--;
|
game_over_counter_--;
|
||||||
|
|
||||||
|
/*
|
||||||
if ((game_over_counter_ == 250) || (game_over_counter_ == 200) || (game_over_counter_ == 180) || (game_over_counter_ == 120) || (game_over_counter_ == 60))
|
if ((game_over_counter_ == 250) || (game_over_counter_ == 200) || (game_over_counter_ == 180) || (game_over_counter_ == 120) || (game_over_counter_ == 60))
|
||||||
{
|
{
|
||||||
// Hace sonar aleatoriamente uno de los 4 sonidos de burbujas
|
// Hace sonar aleatoriamente uno de los 4 sonidos de burbujas
|
||||||
@@ -294,6 +299,7 @@ void Game::updateGameOverState()
|
|||||||
JA_Sound_t *sound[4] = {Resource::get()->getSound("bubble1.wav"), Resource::get()->getSound("bubble2.wav"), Resource::get()->getSound("bubble3.wav"), Resource::get()->getSound("bubble4.wav")};
|
JA_Sound_t *sound[4] = {Resource::get()->getSound("bubble1.wav"), Resource::get()->getSound("bubble2.wav"), Resource::get()->getSound("bubble3.wav"), Resource::get()->getSound("bubble4.wav")};
|
||||||
JA_PlaySound(sound[index], 0);
|
JA_PlaySound(sound[index], 0);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if (game_over_counter_ == 150)
|
if (game_over_counter_ == 150)
|
||||||
{
|
{
|
||||||
@@ -724,7 +730,9 @@ void Game::createMessage(const std::vector<Path> &paths, std::shared_ptr<Texture
|
|||||||
|
|
||||||
// Inicializa
|
// Inicializa
|
||||||
for (const auto &path : paths)
|
for (const auto &path : paths)
|
||||||
|
{
|
||||||
path_sprites_.back()->addPath(path, true);
|
path_sprites_.back()->addPath(path, true);
|
||||||
|
}
|
||||||
path_sprites_.back()->enable();
|
path_sprites_.back()->enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -817,13 +825,13 @@ void Game::killPlayer(std::shared_ptr<Player> &player)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Si no tiene cafes, muere
|
// Si no tiene cafes, muere
|
||||||
pauseMusic();
|
// pauseMusic();
|
||||||
balloon_manager_->stopAllBalloons();
|
balloon_manager_->stopAllBalloons();
|
||||||
JA_PlaySound(Resource::get()->getSound("player_collision.wav"));
|
JA_PlaySound(Resource::get()->getSound("player_collision.wav"));
|
||||||
screen_->shake();
|
screen_->shake();
|
||||||
JA_PlaySound(Resource::get()->getSound("voice_no.wav"));
|
JA_PlaySound(Resource::get()->getSound("voice_no.wav"));
|
||||||
player->setPlayingState(PlayerState::DYING);
|
player->setPlayingState(PlayerState::DYING);
|
||||||
allPlayersAreNotPlaying() ? stopMusic() : resumeMusic();
|
// allPlayersAreNotPlaying() ? stopMusic() : resumeMusic();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -871,7 +879,7 @@ void Game::update()
|
|||||||
|
|
||||||
checkMusicStatus();
|
checkMusicStatus();
|
||||||
screen_->update();
|
screen_->update();
|
||||||
globalInputs::update();
|
globalInputs::update();
|
||||||
fillCanvas();
|
fillCanvas();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -962,10 +970,8 @@ void Game::disableTimeStopItem()
|
|||||||
// Comprueba si la música ha de estar sonando
|
// Comprueba si la música ha de estar sonando
|
||||||
void Game::checkMusicStatus()
|
void Game::checkMusicStatus()
|
||||||
{
|
{
|
||||||
// Si la música no está sonando
|
// Si se ha completado el juego o los jugadores han terminado, detiene la música
|
||||||
if (JA_GetMusicState() == JA_MUSIC_INVALID || JA_GetMusicState() == JA_MUSIC_STOPPED)
|
state_ == GameState::COMPLETED || allPlayersAreGameOver() ? stopMusic() : playMusic();
|
||||||
// Si se ha completado el juego o los jugadores han terminado, detiene la música
|
|
||||||
state_ == GameState::COMPLETED || allPlayersAreGameOver() ? JA_StopMusic() : JA_PlayMusic(Resource::get()->getMusic("playing.ogg"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bucle para el juego
|
// Bucle para el juego
|
||||||
@@ -1000,8 +1006,7 @@ void Game::initPaths()
|
|||||||
paths_.emplace_back(Path(createPath(x1, x2, PathType::HORIZONTAL, y, 80, easeInQuint), 0));
|
paths_.emplace_back(Path(createPath(x1, x2, PathType::HORIZONTAL, y, 80, easeInQuint), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recorrido para el texto de "Last Stage!" o de "X stages left" o "Game Over"
|
// Recorrido para el texto de "Last Stage!" o de "X stages left" o "Game Over" (2,3)
|
||||||
// (2,3)
|
|
||||||
{
|
{
|
||||||
const auto &texture = Resource::get()->getTexture("last_stage");
|
const auto &texture = Resource::get()->getTexture("last_stage");
|
||||||
const auto h = texture->getHeight();
|
const auto h = texture->getHeight();
|
||||||
@@ -1693,6 +1698,16 @@ void Game::resumeMusic()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hace sonar la música
|
||||||
|
void Game::playMusic()
|
||||||
|
{
|
||||||
|
// Si la música no está sonando
|
||||||
|
if (JA_GetMusicState() == JA_MUSIC_INVALID || JA_GetMusicState() == JA_MUSIC_STOPPED)
|
||||||
|
{
|
||||||
|
JA_PlayMusic(Resource::get()->getMusic("playing.ogg"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Detiene la música
|
// Detiene la música
|
||||||
void Game::stopMusic()
|
void Game::stopMusic()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -373,6 +373,9 @@ private:
|
|||||||
// Reanuda la música
|
// Reanuda la música
|
||||||
void resumeMusic();
|
void resumeMusic();
|
||||||
|
|
||||||
|
// Hace sonar la música
|
||||||
|
void playMusic();
|
||||||
|
|
||||||
// Detiene la música
|
// Detiene la música
|
||||||
void stopMusic();
|
void stopMusic();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user