Posat ordre en el constructor de Game
This commit is contained in:
373
source/game.cpp
373
source/game.cpp
@@ -26,7 +26,6 @@
|
||||
#include "lang.h" // para getText
|
||||
#include "manage_hiscore_table.h" // para ManageHiScoreTable
|
||||
#include "notifier.h" // para Notifier
|
||||
#include "options.h" // para options
|
||||
#include "param.h" // para param
|
||||
#include "player.h" // para Player, PlayerStatus
|
||||
#include "resource.h" // para Resource
|
||||
@@ -42,39 +41,35 @@ struct JA_Sound_t; // lines 36-36
|
||||
|
||||
// Constructor
|
||||
Game::Game(int player_id, int current_stage, bool demo)
|
||||
: current_stage_(current_stage)
|
||||
: renderer_(Screen::get()->getRenderer()),
|
||||
screen_(Screen::get()),
|
||||
asset_(Asset::get()),
|
||||
input_(Input::get()),
|
||||
background_(std::make_unique<Background>()),
|
||||
explosions_(std::make_unique<Explosions>()),
|
||||
balloon_formations_(std::make_unique<BalloonFormations>()),
|
||||
canvas_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.play_area.rect.w, param.game.play_area.rect.h)),
|
||||
fade_(std::make_unique<Fade>()),
|
||||
current_stage_(current_stage),
|
||||
last_stage_reached_(current_stage)
|
||||
{
|
||||
// Copia los punteros
|
||||
asset_ = Asset::get();
|
||||
input_ = Input::get();
|
||||
screen_ = Screen::get();
|
||||
renderer_ = screen_->getRenderer();
|
||||
|
||||
// Pasa variables
|
||||
demo_.enabled = demo;
|
||||
last_stage_reached_ = current_stage_;
|
||||
difficulty_ = options.game.difficulty;
|
||||
|
||||
// Crea los objetos
|
||||
Scoreboard::init();
|
||||
scoreboard_ = Scoreboard::get();
|
||||
fade_ = std::make_unique<Fade>();
|
||||
// Otras variables
|
||||
section::name = section::Name::GAME;
|
||||
section::options = section::Options::GAME_PLAY_1P;
|
||||
|
||||
background_ = std::make_unique<Background>();
|
||||
explosions_ = std::make_unique<Explosions>();
|
||||
balloon_formations_ = std::make_unique<BalloonFormations>();
|
||||
|
||||
// Asigna los recursos a variables privadas del objeto
|
||||
// Asigna texturas y animaciones
|
||||
setResources();
|
||||
|
||||
// Inicializa los vectores con los datos para la demo
|
||||
if (demo_.enabled)
|
||||
{ // Aleatoriza la asignación del fichero
|
||||
const auto demo1 = rand() % 2;
|
||||
const auto demo2 = (demo1 == 0) ? 1 : 0;
|
||||
demo_.data.emplace_back(Resource::get()->getDemoData(demo1));
|
||||
demo_.data.emplace_back(Resource::get()->getDemoData(demo2));
|
||||
}
|
||||
// Crea y configura los objetos
|
||||
Scoreboard::init();
|
||||
scoreboard_ = Scoreboard::get();
|
||||
|
||||
fade_->setColor(fade_color.r, fade_color.g, fade_color.b);
|
||||
fade_->setPost(param.fade.post_duration);
|
||||
fade_->setType(FadeType::VENETIAN);
|
||||
|
||||
background_->setPos(param.game.play_area.rect);
|
||||
|
||||
@@ -83,181 +78,16 @@ Game::Game(int player_id, int current_stage, bool demo)
|
||||
explosions_->addTexture(3, explosions_textures_[2], explosions_animations_[2]);
|
||||
explosions_->addTexture(4, explosions_textures_[3], explosions_animations_[3]);
|
||||
|
||||
canvas_ = SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.play_area.rect.w, param.game.play_area.rect.h);
|
||||
SDL_SetTextureBlendMode(canvas_, SDL_BLENDMODE_BLEND);
|
||||
|
||||
// Crea los dos jugadores
|
||||
{
|
||||
const int y = param.game.play_area.rect.h - 30;
|
||||
players_.emplace_back(std::make_unique<Player>(1, param.game.play_area.first_quarter_x - 15, y, demo_.enabled, param.game.play_area.rect, player_textures_[0], player_animations_));
|
||||
players_.back()->setScoreBoardPanel(SCOREBOARD_LEFT_PANEL);
|
||||
players_.back()->setName(lang::getText(53));
|
||||
players_.back()->setController(getController(players_.back()->getId()));
|
||||
|
||||
players_.emplace_back(std::make_unique<Player>(2, param.game.play_area.third_quarter_x - 15, y, demo_.enabled, param.game.play_area.rect, player_textures_[1], player_animations_));
|
||||
players_.back()->setScoreBoardPanel(SCOREBOARD_RIGHT_PANEL);
|
||||
players_.back()->setName(lang::getText(54));
|
||||
players_.back()->setController(getController(players_.back()->getId()));
|
||||
}
|
||||
|
||||
// Activa el jugador que coincide con el "player_id"
|
||||
{
|
||||
auto player = getPlayer(player_id);
|
||||
player->setStatusPlaying(PlayerStatus::PLAYING);
|
||||
player->setInvulnerable(false);
|
||||
}
|
||||
|
||||
// Variables relacionadas con la dificultad
|
||||
switch (difficulty_)
|
||||
{
|
||||
case GameDifficulty::EASY:
|
||||
{
|
||||
default_balloon_speed_ = BALLOON_SPEED_1;
|
||||
difficulty_score_multiplier_ = 0.5f;
|
||||
scoreboard_->setColor(scoreboard_easy_color);
|
||||
break;
|
||||
}
|
||||
|
||||
case GameDifficulty::NORMAL:
|
||||
{
|
||||
default_balloon_speed_ = BALLOON_SPEED_1;
|
||||
difficulty_score_multiplier_ = 1.0f;
|
||||
scoreboard_->setColor(scoreboard_normal_color);
|
||||
break;
|
||||
}
|
||||
|
||||
case GameDifficulty::HARD:
|
||||
{
|
||||
default_balloon_speed_ = BALLOON_SPEED_5;
|
||||
difficulty_score_multiplier_ = 1.5f;
|
||||
scoreboard_->setColor(scoreboard_hard_color);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Variables para el marcador
|
||||
scoreboard_->setPos({param.scoreboard.x, param.scoreboard.y, param.scoreboard.w, param.scoreboard.h});
|
||||
scoreboard_->setMode(SCOREBOARD_CENTER_PANEL, ScoreboardMode::STAGE_INFO);
|
||||
for (const auto &player : players_)
|
||||
{
|
||||
scoreboard_->setName(player->getScoreBoardPanel(), player->getName());
|
||||
if (player->isWaiting())
|
||||
scoreboard_->setMode(player->getScoreBoardPanel(), ScoreboardMode::WAITING);
|
||||
}
|
||||
|
||||
// Resto de variables
|
||||
ticks_ = 0;
|
||||
hi_score_.score = options.game.hi_score_table[0].score;
|
||||
hi_score_.name = options.game.hi_score_table[0].name;
|
||||
paused_ = false;
|
||||
game_completed_ = false;
|
||||
game_completed_counter_ = 0;
|
||||
section::name = section::Name::GAME;
|
||||
section::options = section::Options::GAME_PLAY_1P;
|
||||
current_power_ = 0;
|
||||
menace_current_ = 0;
|
||||
menace_threshold_ = 0;
|
||||
hi_score_achieved_ = false;
|
||||
stage_bitmap_counter_ = STAGE_COUNTER_;
|
||||
game_over_counter_ = GAME_OVER_COUNTER_;
|
||||
time_stopped_ = false;
|
||||
time_stopped_counter_ = 0;
|
||||
counter_ = 0;
|
||||
last_ballon_deploy_ = 0;
|
||||
balloon_deploy_counter_ = 0;
|
||||
balloon_speed_ = default_balloon_speed_;
|
||||
helper_.need_coffee = false;
|
||||
helper_.need_coffee_machine = false;
|
||||
helper_.need_power_ball = false;
|
||||
helper_.counter = HELP_COUNTER_;
|
||||
helper_.item_disk_odds = ITEM_POINTS_1_DISK_ODDS_;
|
||||
helper_.item_gavina_odds = ITEM_POINTS_2_GAVINA_ODDS_;
|
||||
helper_.item_pacmar_odds = ITEM_POINTS_3_PACMAR_ODDS_;
|
||||
helper_.item_clock_odds = ITEM_CLOCK_ODDS_;
|
||||
helper_.item_coffee_odds = ITEM_COFFEE_ODDS_;
|
||||
helper_.item_coffee_machine_odds = ITEM_COFFEE_MACHINE_ODDS_;
|
||||
power_ball_enabled_ = false;
|
||||
power_ball_counter_ = 0;
|
||||
coffee_machine_enabled_ = false;
|
||||
balloons_popped_ = 0;
|
||||
#ifdef DEBUG
|
||||
auto_pop_balloons_ = false;
|
||||
#endif
|
||||
|
||||
// Inicializa las variables para el modo DEMO
|
||||
if (demo_.enabled)
|
||||
{
|
||||
// Selecciona una pantalla al azar
|
||||
{
|
||||
constexpr auto demos = 3;
|
||||
const auto demo = rand() % demos;
|
||||
const int stages[demos] = {0, 3, 5};
|
||||
current_stage_ = stages[demo];
|
||||
}
|
||||
|
||||
// Actualiza el numero de globos explotados según la fase de la demo
|
||||
for (int i = 0; i < current_stage_; ++i)
|
||||
{
|
||||
balloons_popped_ += balloon_formations_->getStage(i).power_to_complete;
|
||||
}
|
||||
|
||||
// Activa o no al otro jugador
|
||||
if (rand() % 2 == 0)
|
||||
{
|
||||
const auto other_player_id = player_id == 1 ? 2 : 1;
|
||||
auto other_player = getPlayer(other_player_id);
|
||||
other_player->setStatusPlaying(PlayerStatus::PLAYING);
|
||||
}
|
||||
|
||||
for (auto &player : players_)
|
||||
{
|
||||
// Añade 0, 1 o 2 cafes al jugador
|
||||
for (int i = 0; i < rand() % 3; ++i)
|
||||
{
|
||||
player->giveExtraHit();
|
||||
}
|
||||
|
||||
// Empieza sin inmunidad
|
||||
player->setInvulnerable(false);
|
||||
}
|
||||
|
||||
// Deshabilita los sonidos
|
||||
JA_EnableSound(false);
|
||||
|
||||
// Configura los marcadores
|
||||
scoreboard_->setMode(SCOREBOARD_LEFT_PANEL, ScoreboardMode::DEMO);
|
||||
scoreboard_->setMode(SCOREBOARD_RIGHT_PANEL, ScoreboardMode::DEMO);
|
||||
}
|
||||
|
||||
// Inicializa el resto de variables
|
||||
initPlayers(player_id);
|
||||
initScoreboard();
|
||||
initDifficultyVars();
|
||||
initDemo(player_id);
|
||||
initPaths();
|
||||
|
||||
total_power_to_complete_game_ = 0;
|
||||
for (int i = 0; i < 10; ++i)
|
||||
{
|
||||
total_power_to_complete_game_ += balloon_formations_->getStage(i).power_to_complete;
|
||||
}
|
||||
|
||||
// Modo grabar demo
|
||||
#ifdef RECORDING
|
||||
demo_.recording = true;
|
||||
#else
|
||||
demo_.recording = false;
|
||||
#endif
|
||||
demo_.counter = 0;
|
||||
|
||||
// Inicializa el objeto para el fundido
|
||||
fade_->setColor(fade_color.r, fade_color.g, fade_color.b);
|
||||
fade_->setPost(param.fade.post_duration);
|
||||
fade_->setType(FadeType::VENETIAN);
|
||||
|
||||
// Con los globos creados, calcula el nivel de amenaza
|
||||
setTotalPower();
|
||||
evaluateAndSetMenace();
|
||||
|
||||
// Inicializa los sprites con los textos que aparecen al coger items
|
||||
smart_sprites_.clear();
|
||||
}
|
||||
|
||||
Game::~Game()
|
||||
@@ -273,11 +103,10 @@ Game::~Game()
|
||||
#endif
|
||||
|
||||
Scoreboard::destroy();
|
||||
|
||||
SDL_DestroyTexture(canvas_);
|
||||
}
|
||||
|
||||
// Asigna los recursos a variables privadas del objeto
|
||||
// Asigna texturas y animaciones
|
||||
void Game::setResources()
|
||||
{
|
||||
// Texturas
|
||||
@@ -404,12 +233,12 @@ void Game::deployBalloonFormation()
|
||||
auto set = rand() % 10;
|
||||
|
||||
// Evita repetir la ultima formación enemiga desplegada
|
||||
if (set == last_ballon_deploy_)
|
||||
if (set == last_balloon_deploy_)
|
||||
{
|
||||
++set %= 10;
|
||||
}
|
||||
|
||||
last_ballon_deploy_ = set;
|
||||
last_balloon_deploy_ = set;
|
||||
|
||||
const Stage stage = balloon_formations_->getStage(current_stage_);
|
||||
const auto numEnemies = stage.balloon_pool->set[set]->number_of_balloons;
|
||||
@@ -2255,3 +2084,143 @@ void Game::handleNameInput(const std::shared_ptr<Player> &player)
|
||||
player->setStatusPlaying(PlayerStatus::CONTINUE);
|
||||
}
|
||||
}
|
||||
|
||||
// Inicializa las variables para el modo DEMO
|
||||
void Game::initDemo(int player_id)
|
||||
{
|
||||
if (demo_.enabled)
|
||||
{
|
||||
// Aleatoriza la asignación del fichero con los datos del modo demostracion
|
||||
const auto demo1 = rand() % 2;
|
||||
const auto demo2 = (demo1 == 0) ? 1 : 0;
|
||||
demo_.data.emplace_back(Resource::get()->getDemoData(demo1));
|
||||
demo_.data.emplace_back(Resource::get()->getDemoData(demo2));
|
||||
|
||||
// Selecciona una pantalla al azar
|
||||
{
|
||||
constexpr auto demos = 3;
|
||||
const auto demo = rand() % demos;
|
||||
const int stages[demos] = {0, 3, 5};
|
||||
current_stage_ = stages[demo];
|
||||
}
|
||||
|
||||
// Actualiza el numero de globos explotados según la fase del modo demostración
|
||||
for (int i = 0; i < current_stage_; ++i)
|
||||
{
|
||||
balloons_popped_ += balloon_formations_->getStage(i).power_to_complete;
|
||||
}
|
||||
|
||||
// Activa o no al otro jugador
|
||||
if (rand() % 2 == 0)
|
||||
{
|
||||
const auto other_player_id = player_id == 1 ? 2 : 1;
|
||||
auto other_player = getPlayer(other_player_id);
|
||||
other_player->setStatusPlaying(PlayerStatus::PLAYING);
|
||||
}
|
||||
|
||||
// Asigna cafes a los jugadores
|
||||
for (auto &player : players_)
|
||||
{
|
||||
for (int i = 0; i < rand() % 3; ++i)
|
||||
player->giveExtraHit();
|
||||
|
||||
player->setInvulnerable(false);
|
||||
}
|
||||
|
||||
// Deshabilita los sonidos
|
||||
JA_EnableSound(false);
|
||||
|
||||
// Configura los marcadores
|
||||
scoreboard_->setMode(SCOREBOARD_LEFT_PANEL, ScoreboardMode::DEMO);
|
||||
scoreboard_->setMode(SCOREBOARD_RIGHT_PANEL, ScoreboardMode::DEMO);
|
||||
}
|
||||
|
||||
// Modo grabar demo
|
||||
#ifdef RECORDING
|
||||
demo_.recording = true;
|
||||
#else
|
||||
demo_.recording = false;
|
||||
#endif
|
||||
demo_.counter = 0;
|
||||
}
|
||||
|
||||
// Calcula el poder total necesario para completar el juego
|
||||
void Game::setTotalPower()
|
||||
{
|
||||
total_power_to_complete_game_ = 0;
|
||||
for (int i = 0; i < 10; ++i)
|
||||
{
|
||||
total_power_to_complete_game_ += balloon_formations_->getStage(i).power_to_complete;
|
||||
}
|
||||
}
|
||||
|
||||
// Inicializa el marcador
|
||||
void Game::initScoreboard()
|
||||
{
|
||||
scoreboard_->setPos({param.scoreboard.x, param.scoreboard.y, param.scoreboard.w, param.scoreboard.h});
|
||||
scoreboard_->setMode(SCOREBOARD_CENTER_PANEL, ScoreboardMode::STAGE_INFO);
|
||||
for (const auto &player : players_)
|
||||
{
|
||||
scoreboard_->setName(player->getScoreBoardPanel(), player->getName());
|
||||
if (player->isWaiting())
|
||||
scoreboard_->setMode(player->getScoreBoardPanel(), ScoreboardMode::WAITING);
|
||||
}
|
||||
}
|
||||
|
||||
// Inicializa las opciones relacionadas con la dificultad
|
||||
void Game::initDifficultyVars()
|
||||
{
|
||||
// Variables relacionadas con la dificultad
|
||||
switch (difficulty_)
|
||||
{
|
||||
case GameDifficulty::EASY:
|
||||
{
|
||||
default_balloon_speed_ = BALLOON_SPEED_1;
|
||||
difficulty_score_multiplier_ = 0.5f;
|
||||
scoreboard_->setColor(scoreboard_easy_color);
|
||||
break;
|
||||
}
|
||||
|
||||
case GameDifficulty::NORMAL:
|
||||
{
|
||||
default_balloon_speed_ = BALLOON_SPEED_1;
|
||||
difficulty_score_multiplier_ = 1.0f;
|
||||
scoreboard_->setColor(scoreboard_normal_color);
|
||||
break;
|
||||
}
|
||||
|
||||
case GameDifficulty::HARD:
|
||||
{
|
||||
default_balloon_speed_ = BALLOON_SPEED_5;
|
||||
difficulty_score_multiplier_ = 1.5f;
|
||||
scoreboard_->setColor(scoreboard_hard_color);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
balloon_speed_ = default_balloon_speed_;
|
||||
}
|
||||
|
||||
// Inicializa los jugadores
|
||||
void Game::initPlayers(int player_id)
|
||||
{
|
||||
// Crea los dos jugadores
|
||||
const int y = param.game.play_area.rect.h - 30;
|
||||
players_.emplace_back(std::make_unique<Player>(1, param.game.play_area.first_quarter_x - 15, y, demo_.enabled, param.game.play_area.rect, player_textures_[0], player_animations_));
|
||||
players_.back()->setScoreBoardPanel(SCOREBOARD_LEFT_PANEL);
|
||||
players_.back()->setName(lang::getText(53));
|
||||
players_.back()->setController(getController(players_.back()->getId()));
|
||||
|
||||
players_.emplace_back(std::make_unique<Player>(2, param.game.play_area.third_quarter_x - 15, y, demo_.enabled, param.game.play_area.rect, player_textures_[1], player_animations_));
|
||||
players_.back()->setScoreBoardPanel(SCOREBOARD_RIGHT_PANEL);
|
||||
players_.back()->setName(lang::getText(54));
|
||||
players_.back()->setController(getController(players_.back()->getId()));
|
||||
|
||||
// Activa el jugador que coincide con el "player_id"
|
||||
auto player = getPlayer(player_id);
|
||||
player->setStatusPlaying(PlayerStatus::PLAYING);
|
||||
player->setInvulnerable(false);
|
||||
}
|
||||
Reference in New Issue
Block a user