Creada la classe Resource

Afegida la musica i els sons a Resource
This commit is contained in:
2024-10-19 10:07:14 +02:00
parent b879673bc2
commit f23dcae5b6
19 changed files with 243 additions and 258 deletions

View File

@@ -34,6 +34,7 @@
#include "on_screen_help.h" // for OnScreenHelp
#include "options.h" // for options, loadOptionsFile, saveO...
#include "param.h" // for param, loadParamsFromFile
#include "resource.h" //for Resource
#include "screen.h" // for Screen
#include "section.h" // for Name, name, Options, options
#include "title.h" // for Title
@@ -106,6 +107,8 @@ Director::Director(int argc, const char *argv[])
// Crea los objetos
lang::loadFromFile(getLangFile((lang::Code)options.game.language));
Resource::init();
Input::init(Asset::get()->get("gamecontrollerdb.txt"));
initInput();
@@ -115,12 +118,6 @@ Director::Director(int argc, const char *argv[])
OnScreenHelp::init();
// Carga los sonidos del juego
loadSounds();
// Carga las musicas del juego
loadMusics();
globalInputs::init();
}
@@ -129,13 +126,12 @@ Director::~Director()
saveOptionsFile(Asset::get()->get("config.txt"));
Asset::destroy();
Resource::destroy();
Input::destroy();
Screen::destroy();
Notifier::destroy();
OnScreenHelp::destroy();
sounds_.clear();
musics_.clear();
SDL_DestroyRenderer(renderer_);
SDL_DestroyWindow(window_);
@@ -567,38 +563,6 @@ void Director::createSystemFolder(const std::string &folder)
}
}
// Carga los sonidos del juego
void Director::loadSounds()
{
// Obtiene la lista con las rutas a los ficheros de sonidos
auto list = Asset::get()->getListByType(AssetType::SOUND);
sounds_.clear();
for (const auto &l : list)
{
auto last_index = l.find_last_of('/') + 1;
auto name = l.substr(last_index);
sounds_.emplace_back(SoundFile{name, JA_LoadSound(l.c_str())});
}
}
// Carga las musicas del juego
void Director::loadMusics()
{
// Obtiene la lista con las rutas a los ficheros musicales
auto list = Asset::get()->getListByType(AssetType::MUSIC);
musics_.clear();
for (const auto &l : list)
{
auto last_index = l.find_last_of('/') + 1;
auto name = l.substr(last_index);
musics_.emplace_back(MusicFile{name, JA_LoadMusic(l.c_str())});
}
}
// Ejecuta la sección con el logo
void Director::runLogo()
{
@@ -609,14 +573,14 @@ void Director::runLogo()
// Ejecuta la sección con la secuencia de introducción
void Director::runIntro()
{
auto intro = std::make_unique<Intro>(getMusic(musics_, "intro.ogg"));
auto intro = std::make_unique<Intro>();
intro->run();
}
// Ejecuta la sección con el título del juego
void Director::runTitle()
{
auto title = std::make_unique<Title>(getMusic(musics_, "title.ogg"));
auto title = std::make_unique<Title>();
title->run();
}
@@ -625,21 +589,21 @@ void Director::runGame()
{
const auto player_id = section::options == section::Options::GAME_PLAY_1P ? 1 : 2;
constexpr auto current_stage = 0;
auto game = std::make_unique<Game>(player_id, current_stage, GAME_MODE_DEMO_OFF, getMusic(musics_, "playing.ogg"));
auto game = std::make_unique<Game>(player_id, current_stage, GAME_MODE_DEMO_OFF);
game->run();
}
// Ejecuta la sección donde se muestran las instrucciones
void Director::runInstructions()
{
auto instructions = std::make_unique<Instructions>(getMusic(musics_, "title.ogg"));
auto instructions = std::make_unique<Instructions>();
instructions->run();
}
// Ejecuta la sección donde se muestra la tabla de puntuaciones
void Director::runHiScoreTable()
{
auto hi_score_table = std::make_unique<HiScoreTable>(getMusic(musics_, "title.ogg"));
auto hi_score_table = std::make_unique<HiScoreTable>();
hi_score_table->run();
}
@@ -648,7 +612,7 @@ void Director::runDemoGame()
{
const auto player_id = (rand() % 2) + 1;
constexpr auto current_stage = 0;
auto game = std::make_unique<Game>(player_id, current_stage, GAME_MODE_DEMO_ON, nullptr);
auto game = std::make_unique<Game>(player_id, current_stage, GAME_MODE_DEMO_ON);
game->run();
}
@@ -705,7 +669,6 @@ int Director::run()
const auto return_code = (section::options == section::Options::QUIT_NORMAL) ? "keyboard" : "controller";
std::cout << "\nGame end with " << return_code << std::endl;
#ifndef VERBOSE
// Habilita de nuevo los std::cout
std::cout.rdbuf(orig_buf);

View File

@@ -8,8 +8,8 @@ namespace lang
{
enum class Code : int;
}
struct MusicFile;
struct SoundFile;
struct ResourceMusic;
struct ResourceSound;
// Textos
constexpr char WINDOW_CAPTION[] = "Coffee Crisis Arcade Edition";
@@ -26,8 +26,6 @@ private:
std::string executable_path_; // Path del ejecutable
std::string system_folder_; // Carpeta del sistema donde guardar datos
std::string param_file_argument_; // Argumento para gestionar el fichero con los parametros del programa
std::vector<SoundFile> sounds_; // Vector con los sonidos
std::vector<MusicFile> musics_; // Vector con las musicas
// Inicializa jail_audio
void initJailAudio();
@@ -44,12 +42,6 @@ private:
// Crea el indice de ficheros
bool setFileList();
// Carga los sonidos del juego
void loadSounds();
// Carga las musicas del juego
void loadMusics();
// Comprueba los parametros del programa
void checkProgramArguments(int argc, const char *argv[]);

View File

@@ -22,13 +22,14 @@
#include "global_inputs.h" // for check
#include "input.h" // for InputType, Input, INPUT_DO_NOT_ALL...
#include "item.h" // for Item, ItemType::COFFEE_MACHINE, ItemType::CLOCK
#include "jail_audio.h" // for JA_PlaySound, JA_DeleteSound, JA_L...
#include "jail_audio.h" // for JA_PlaySound
#include "lang.h" // for getText
#include "manage_hiscore_table.h" // for ManageHiScoreTable
#include "notifier.h" // for Notifier
#include "options.h" // for options
#include "param.h" // for param
#include "player.h" // for Player, PlayerStatus
#include "resource.h" // for Resource
#include "scoreboard.h" // for Scoreboard, ScoreboardMode, SCOREB...
#include "screen.h" // for Screen
#include "section.h" // for Name, name, Options, options
@@ -39,9 +40,8 @@ struct JA_Music_t; // lines 35-35
struct JA_Sound_t; // lines 36-36
// Constructor
Game::Game(int player_id, int current_stage, bool demo, JA_Music_t *music)
: music_(music),
current_stage_(current_stage)
Game::Game(int player_id, int current_stage, bool demo)
: current_stage_(current_stage)
{
// Copia los punteros
asset_ = Asset::get();
@@ -429,25 +429,6 @@ void Game::loadMedia()
text_nokia2_big_ = std::make_unique<Text>(asset_->get("nokia_big2.png"), asset_->get("nokia_big2.txt"), renderer_);
}
// Sonidos
{
balloon_sound_ = JA_LoadSound(asset_->get("balloon.wav").c_str());
bubble1_sound_ = JA_LoadSound(asset_->get("bubble1.wav").c_str());
bubble2_sound_ = JA_LoadSound(asset_->get("bubble2.wav").c_str());
bubble3_sound_ = JA_LoadSound(asset_->get("bubble3.wav").c_str());
bubble4_sound_ = JA_LoadSound(asset_->get("bubble4.wav").c_str());
bullet_sound_ = JA_LoadSound(asset_->get("bullet.wav").c_str());
clock_sound_ = JA_LoadSound(asset_->get("clock.wav").c_str());
coffee_out_sound_ = JA_LoadSound(asset_->get("coffeeout.wav").c_str());
hi_score_sound_ = JA_LoadSound(asset_->get("hiscore.wav").c_str());
item_drop_sound_ = JA_LoadSound(asset_->get("itemdrop.wav").c_str());
item_pick_up_sound_ = JA_LoadSound(asset_->get("itempickup.wav").c_str());
player_collision_sound_ = JA_LoadSound(asset_->get("player_collision.wav").c_str());
power_ball_sound_ = JA_LoadSound(asset_->get("powerball.wav").c_str());
stage_change_sound_ = JA_LoadSound(asset_->get("stage_change.wav").c_str());
coffee_machine_sound_ = JA_LoadSound(asset_->get("title.wav").c_str());
}
std::cout << "** RESOURCES FOR GAME SECTION LOADED\n"
<< std::endl;
}
@@ -467,23 +448,6 @@ void Game::unloadMedia()
balloon_animations_.clear();
explosions_animations_.clear();
item_animations_.clear();
// Sonidos
JA_DeleteSound(balloon_sound_);
JA_DeleteSound(bullet_sound_);
JA_DeleteSound(player_collision_sound_);
JA_DeleteSound(hi_score_sound_);
JA_DeleteSound(item_drop_sound_);
JA_DeleteSound(item_pick_up_sound_);
JA_DeleteSound(coffee_out_sound_);
JA_DeleteSound(stage_change_sound_);
JA_DeleteSound(bubble1_sound_);
JA_DeleteSound(bubble2_sound_);
JA_DeleteSound(bubble3_sound_);
JA_DeleteSound(bubble4_sound_);
JA_DeleteSound(clock_sound_);
JA_DeleteSound(power_ball_sound_);
JA_DeleteSound(coffee_machine_sound_);
}
// Carga el fichero de datos para la demo
@@ -649,7 +613,7 @@ void Game::updateHiScore()
if (hi_score_achieved_ == false)
{
hi_score_achieved_ = true;
JA_PlaySound(hi_score_sound_);
JA_PlaySound(Resource::get()->getSound("hiscore.wav"));
}
}
}
@@ -725,7 +689,7 @@ void Game::updateStage()
updateHiScore();
JA_StopMusic();
}
JA_PlaySound(stage_change_sound_);
JA_PlaySound(Resource::get()->getSound("stage_change.wav"));
stage_bitmap_counter_ = 0;
balloon_speed_ = default_balloon_speed_;
setBalloonSpeed(balloon_speed_);
@@ -763,7 +727,11 @@ void Game::updateGameOver()
{
// Hace sonar aleatoriamente uno de los 4 sonidos de burbujas
const auto index = rand() % 4;
JA_Sound_t *sound[4] = {bubble1_sound_, bubble2_sound_, bubble3_sound_, bubble4_sound_};
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);
}
@@ -991,7 +959,7 @@ void Game::destroyAllBalloons()
}
balloon_deploy_counter_ = 300;
JA_PlaySound(power_ball_sound_);
JA_PlaySound(Resource::get()->getSound("powerball.wav"));
screen_->flash(flash_color, 5);
screen_->shake();
}
@@ -1119,7 +1087,7 @@ void Game::checkPlayerItemCollision(std::shared_ptr<Player> &player)
}
updateHiScore();
JA_PlaySound(item_pick_up_sound_);
JA_PlaySound(Resource::get()->getSound("itempickup.wav"));
item->disable();
}
}
@@ -1154,7 +1122,7 @@ void Game::checkBulletBalloonCollision()
if (droppeditem != ItemType::COFFEE_MACHINE)
{
createItem(droppeditem, balloon->getPosX(), balloon->getPosY());
JA_PlaySound(item_drop_sound_);
JA_PlaySound(Resource::get()->getSound("itemdrop.wav"));
}
else
{
@@ -1167,7 +1135,7 @@ void Game::checkBulletBalloonCollision()
popBalloon(balloon);
// Sonido de explosión
JA_PlaySound(balloon_sound_);
JA_PlaySound(Resource::get()->getSound("balloon.wav"));
// Deshabilita la bala
bullet->disable();
@@ -1209,8 +1177,7 @@ void Game::renderBullets()
// Crea un objeto bala
void Game::createBullet(int x, int y, BulletType kind, bool powered_up, int owner)
{
auto b = std::make_unique<Bullet>(x, y, kind, powered_up, owner, &(param.game.play_area.rect), bullet_texture_);
bullets_.push_back(std::move(b));
bullets_.emplace_back(std::make_unique<Bullet>(x, y, kind, powered_up, owner, &(param.game.play_area.rect), bullet_texture_));
}
// Vacia el vector de balas
@@ -1238,7 +1205,7 @@ void Game::updateItems()
item->update();
if (item->isOnFloor())
{
JA_PlaySound(coffee_machine_sound_);
JA_PlaySound(Resource::get()->getSound("title.wav"));
screen_->shake();
}
}
@@ -1439,7 +1406,7 @@ void Game::killPlayer(std::shared_ptr<Player> &player)
// Lo pierde
player->removeExtraHit();
throwCoffee(player->getPosX() + (player->getWidth() / 2), player->getPosY() + (player->getHeight() / 2));
JA_PlaySound(coffee_out_sound_);
JA_PlaySound(Resource::get()->getSound("coffeeout.wav"));
screen_->shake();
}
else
@@ -1450,9 +1417,9 @@ void Game::killPlayer(std::shared_ptr<Player> &player)
JA_PauseMusic();
}
stopAllBalloons(10);
JA_PlaySound(player_collision_sound_);
JA_PlaySound(Resource::get()->getSound("player_collision.wav"));
screen_->shake();
JA_PlaySound(coffee_out_sound_);
JA_PlaySound(Resource::get()->getSound("coffeeout.wav"));
player->setStatusPlaying(PlayerStatus::DYING);
if (!demo_.enabled)
{
@@ -1772,14 +1739,14 @@ void Game::renderMessages()
{
if (time_stopped_counter_ % 30 == 0)
{
JA_PlaySound(clock_sound_);
JA_PlaySound(Resource::get()->getSound("clock.wav"));
}
}
else
{
if (time_stopped_counter_ % 15 == 0)
{
JA_PlaySound(clock_sound_);
JA_PlaySound(Resource::get()->getSound("clock.wav"));
}
}
}
@@ -1843,7 +1810,7 @@ void Game::checkMusicStatus()
if (JA_GetMusicState() == JA_MUSIC_INVALID || JA_GetMusicState() == JA_MUSIC_STOPPED)
{
// Si se ha completado el juego o los jugadores han terminado, detiene la música
game_completed_ || allPlayersAreGameOver() ? JA_StopMusic() : JA_PlayMusic(music_);
game_completed_ || allPlayersAreGameOver() ? JA_StopMusic() : JA_PlayMusic(Resource::get()->getMusic("playing.ogg"));
}
}
@@ -2352,6 +2319,7 @@ void Game::handleFireInput(const std::shared_ptr<Player> &player, BulletType bul
player->setInput(bulletType == BulletType::UP ? InputType::FIRE_CENTER : bulletType == BulletType::LEFT ? InputType::FIRE_LEFT
: InputType::FIRE_RIGHT);
createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), bulletType, player->isPowerUp(), player->getId());
JA_PlaySound(Resource::get()->getSound("bullet.wav"));
player->setFireCooldown(10); // Establece un tiempo de espera para el próximo disparo.
}
}

View File

@@ -145,24 +145,6 @@ private:
std::unique_ptr<Fade> fade_; // Objeto para renderizar fades
JA_Sound_t *balloon_sound_; // Sonido para la explosión del globo
JA_Sound_t *bullet_sound_; // Sonido para los disparos
JA_Sound_t *player_collision_sound_; // Sonido para la colisión del jugador con un enemigo
JA_Sound_t *hi_score_sound_; // Sonido para cuando se alcanza la máxima puntuación
JA_Sound_t *item_drop_sound_; // Sonido para cuando se genera un item
JA_Sound_t *item_pick_up_sound_; // Sonido para cuando se recoge un item
JA_Sound_t *coffee_out_sound_; // Sonido para cuando el jugador pierde el café al recibir un impacto
JA_Sound_t *stage_change_sound_; // Sonido para cuando se cambia de fase
JA_Sound_t *bubble1_sound_; // Sonido para cuando el jugador muere
JA_Sound_t *bubble2_sound_; // Sonido para cuando el jugador muere
JA_Sound_t *bubble3_sound_; // Sonido para cuando el jugador muere
JA_Sound_t *bubble4_sound_; // Sonido para cuando el jugador muere
JA_Sound_t *clock_sound_; // Sonido para cuando se detiene el tiempo con el item reloj
JA_Sound_t *power_ball_sound_; // Sonido para cuando se explota una Power Ball
JA_Sound_t *coffee_machine_sound_; // Sonido para cuando la máquina de café toca el suelo
JA_Music_t *music_; // Musica de fondo
// Variables
Uint32 ticks_; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticks_speed_; // Velocidad a la que se repiten los bucles del programa
@@ -468,7 +450,7 @@ private:
public:
// Constructor
Game(int playerID, int current_stage, bool demo, JA_Music_t *music);
Game(int playerID, int current_stage, bool demo);
// Destructor
~Game();

View File

@@ -3,8 +3,9 @@
#include <algorithm> // for max
#include "animated_sprite.h" // for SpriteAnimated
#include "asset.h" // for Asset
#include "jail_audio.h" // for JA_DeleteSound, JA_LoadSound, JA_PlaySound
#include "jail_audio.h" // JA_PlaySound
#include "param.h" // for param
#include "resource.h" // for Resource
#include "screen.h" // for Screen
#include "smart_sprite.h" // for SpriteSmart
#include "sprite.h" // for Sprite
@@ -26,7 +27,6 @@ GameLogo::GameLogo(int x, int y)
arcade_edition_sprite_(std::make_unique<Sprite>(arcade_edition_texture_, (param.game.width - arcade_edition_texture_->getWidth()) / 2, param.title.arcade_edition_position, arcade_edition_texture_->getWidth(), arcade_edition_texture_->getHeight())),
crash_sound_(JA_LoadSound(Asset::get()->get("title.wav").c_str())),
x_(x),
y_(y)
@@ -35,12 +35,6 @@ GameLogo::GameLogo(int x, int y)
init();
}
// Destructor
GameLogo::~GameLogo()
{
JA_DeleteSound(crash_sound_);
}
// Inicializa las variables
void GameLogo::init()
{
@@ -137,7 +131,7 @@ void GameLogo::update()
status_ = Status::SHAKING;
// Reproduce el efecto sonoro
JA_PlaySound(crash_sound_);
JA_PlaySound(Resource::get()->getSound("title.wav"));
}
break;

View File

@@ -1,8 +1,8 @@
#pragma once
#include <memory> // for unique_ptr, shared_ptr
class AnimatedSprite;
class SmartSprite;
#include "animated_sprite.h"
#include "smart_sprite.h"
class Sprite;
class Texture;
struct JA_Sound_t; // lines 10-10
@@ -43,8 +43,6 @@ private:
std::unique_ptr<Sprite> arcade_edition_sprite_; // Sprite con los graficos de "Arcade Edition"
JA_Sound_t *crash_sound_; // Sonido con el impacto del título
// Variables
int x_; // Posición donde dibujar el logo
int y_; // Posición donde dibujar el logo
@@ -63,7 +61,7 @@ public:
GameLogo(int x, int y);
// Destructor
~GameLogo();
~GameLogo() = default;
// Pinta la clase en pantalla
void render();

View File

@@ -15,14 +15,14 @@
#include "lang.h" // for getText
#include "options.h" // for options
#include "param.h" // for param
#include "resource.h" // for Resource
#include "screen.h" // for Screen
#include "section.h" // for Name, name, Options, options
#include "text.h" // for Text, TEXT_CENTER, TEXT_SHADOW, TEXT...
#include "utils.h" // for Param, ParamGame, Color, HiScoreEntry
// Constructor
HiScoreTable::HiScoreTable(JA_Music_t *music)
: music_(music)
HiScoreTable::HiScoreTable()
{
// Copia punteros
renderer_ = Screen::get()->getRenderer();
@@ -78,7 +78,7 @@ void HiScoreTable::update()
// Mantiene la música sonando
if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED))
{
JA_PlayMusic(music_);
JA_PlayMusic(Resource::get()->getMusic("title.ogg"));
}
// Actualiza el objeto screen

View File

@@ -9,7 +9,6 @@ class Background; // lines 8-8
class Fade; // lines 9-9
class Text; // lines 10-10
enum class FadeMode : Uint8; // lines 11-11
struct JA_Music_t; // lines 12-12
/*
Esta clase gestiona un estado del programa. Se encarga de mostrar la tabla con las puntuaciones
@@ -28,7 +27,6 @@ private:
// Objetos y punteros
SDL_Renderer *renderer_; // El renderizador de la ventana
SDL_Texture *backbuffer_; // Textura para usar como backbuffer
JA_Music_t *music_; // Musica de fondo
std::unique_ptr<Fade> fade_; // Objeto para renderizar fades
std::unique_ptr<Background> background_; // Objeto para dibujar el fondo del juego
@@ -68,7 +66,7 @@ private:
public:
// Constructor
explicit HiScoreTable(JA_Music_t *music);
HiScoreTable();
// Destructor
~HiScoreTable();

View File

@@ -13,6 +13,7 @@
#include "jail_audio.h" // for JA_GetMusicState, JA_Music_state
#include "lang.h" // for getText
#include "param.h" // for param
#include "resource.h" // for Resource
#include "screen.h" // for Screen
#include "section.h" // for Name, name, Options, options
#include "sprite.h" // for Sprite
@@ -23,8 +24,7 @@
struct JA_Music_t; // lines 22-22
// Constructor
Instructions::Instructions(JA_Music_t *music)
: music_(music)
Instructions::Instructions()
{
// Copia los punteros
renderer_ = Screen::get()->getRenderer();
@@ -80,20 +80,11 @@ Instructions::~Instructions()
void Instructions::iniSprites()
{
// Inicializa las texturas
auto item1 = std::make_shared<Texture>(renderer_, Asset::get()->get("item_points1_disk.png"));
item_textures_.push_back(item1);
auto item2 = std::make_shared<Texture>(renderer_, Asset::get()->get("item_points2_gavina.png"));
item_textures_.push_back(item2);
auto item3 = std::make_shared<Texture>(renderer_, Asset::get()->get("item_points3_pacmar.png"));
item_textures_.push_back(item3);
auto item4 = std::make_shared<Texture>(renderer_, Asset::get()->get("item_clock.png"));
item_textures_.push_back(item4);
auto item5 = std::make_shared<Texture>(renderer_, Asset::get()->get("item_coffee.png"));
item_textures_.push_back(item5);
item_textures_.emplace_back(std::make_shared<Texture>(renderer_, Asset::get()->get("item_points1_disk.png")));
item_textures_.emplace_back(std::make_shared<Texture>(renderer_, Asset::get()->get("item_points2_gavina.png")));
item_textures_.emplace_back(std::make_shared<Texture>(renderer_, Asset::get()->get("item_points3_pacmar.png")));
item_textures_.emplace_back(std::make_shared<Texture>(renderer_, Asset::get()->get("item_clock.png")));
item_textures_.emplace_back(std::make_shared<Texture>(renderer_, Asset::get()->get("item_coffee.png")));
// Inicializa los sprites
for (int i = 0; i < (int)item_textures_.size(); ++i)
@@ -231,7 +222,7 @@ void Instructions::update()
// Mantiene la música sonando
if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED))
JA_PlayMusic(music_);
JA_PlayMusic(Resource::get()->getMusic("title.ogg"));
// Actualiza el objeto screen
Screen::get()->update();

View File

@@ -37,7 +37,6 @@ private:
std::unique_ptr<Fade> fade_; // Objeto para renderizar fades
SDL_Renderer *renderer_; // El renderizador de la ventana
JA_Music_t *music_; // Musica de fondo
SDL_Texture *texture_; // Textura fija con el texto
SDL_Texture *backbuffer_; // Textura para usar como backbuffer
@@ -79,7 +78,7 @@ private:
public:
// Constructor
explicit Instructions(JA_Music_t *music);
Instructions();
// Destructor
~Instructions();

View File

@@ -9,6 +9,7 @@
#include "jail_audio.h" // for JA_StopMusic, JA_PlayMusic
#include "lang.h" // for getText
#include "param.h" // for param
#include "resource.h" // for Resource
#include "screen.h" // for Screen
#include "section.h" // for Name, name, Options, options
#include "smart_sprite.h" // for SpriteSmart
@@ -19,8 +20,7 @@
struct JA_Music_t; // lines 19-19
// Constructor
Intro::Intro(JA_Music_t *music)
: music_(music)
Intro::Intro()
{
// Copia los punteros
auto renderer = Screen::get()->getRenderer();
@@ -425,7 +425,7 @@ void Intro::render()
// Bucle principal
void Intro::run()
{
JA_PlayMusic(music_, 0);
JA_PlayMusic(Resource::get()->getMusic("intro.ogg"), 0);
while (section::name == section::Name::INTRO)
{

View File

@@ -28,7 +28,6 @@ private:
// Variables
Uint32 ticks_; // Contador de ticks para ajustar la velocidad del programa
Uint8 ticks_speed_; // Velocidad a la que se repiten los bucles del programa
JA_Music_t *music_; // Musica para la intro
int scene_; // Indica que escena está activa
// Actualiza las variables del objeto
@@ -51,7 +50,7 @@ private:
public:
// Constructor
explicit Intro(JA_Music_t *music);
Intro();
// Destructor
~Intro() = default;

View File

@@ -223,7 +223,7 @@ JA_Sound_t *JA_LoadSound(const char* filename) {
int JA_PlaySound(JA_Sound_t *sound, const int loop)
{
if (!JA_soundEnabled) return 0;
if (!JA_soundEnabled || !sound) return 0;
int channel = 0;
while (channel < JA_MAX_SIMULTANEOUS_CHANNELS && channels[channel].state != JA_CHANNEL_FREE) { channel++; }

101
source/resource.cpp Normal file
View File

@@ -0,0 +1,101 @@
#include "resource.h"
#include "asset.h"
// [SINGLETON] Hay que definir las variables estáticas, desde el .h sólo la hemos declarado
Resource *Resource::resource_ = nullptr;
// [SINGLETON] Crearemos el objeto screen con esta función estática
void Resource::init()
{
Resource::resource_ = new Resource();
}
// [SINGLETON] Destruiremos el objeto screen con esta función estática
void Resource::destroy()
{
delete Resource::resource_;
}
// [SINGLETON] Con este método obtenemos el objeto screen y podemos trabajar con él
Resource *Resource::get()
{
return Resource::resource_;
}
// Constructor
Resource::Resource()
{
loadSounds();
loadMusics();
}
// Destructor
Resource::~Resource()
{
sounds_.clear();
musics_.clear();
}
// Obtiene el fichero de sonido a partir de un nombre
JA_Sound_t *Resource::getSound(const std::string &name)
{
for (const auto &s : sounds_)
{
if (s.name == name)
{
return s.sound;
}
}
return nullptr;
}
// Obtiene el fichero de música a partir de un nombre
JA_Music_t *Resource::getMusic(const std::string &name)
{
for (const auto &m : musics_)
{
if (m.name == name)
{
return m.music;
}
}
return nullptr;
}
// Carga los sonidos del juego
void Resource::loadSounds()
{
// Obtiene la lista con las rutas a los ficheros de sonidos
auto list = Asset::get()->getListByType(AssetType::SOUND);
sounds_.clear();
for (const auto &l : list)
{
// Encuentra el último índice de '/'
auto last_index = l.find_last_of('/') + 1;
// Obtiene la subcadena desde el último '/'
auto name = l.substr(last_index);
sounds_.emplace_back(ResourceSound{name, JA_LoadSound(l.c_str())});
}
}
// Carga las musicas del juego
void Resource::loadMusics()
{
// Obtiene la lista con las rutas a los ficheros musicales
auto list = Asset::get()->getListByType(AssetType::MUSIC);
musics_.clear();
for (const auto &l : list)
{
// Encuentra el último índice de '/'
auto last_index = l.find_last_of('/') + 1;
// Obtiene la subcadena desde el último '/'
auto name = l.substr(last_index);
musics_.emplace_back(ResourceMusic{name, JA_LoadMusic(l.c_str())});
}
}

60
source/resource.h Normal file
View File

@@ -0,0 +1,60 @@
#pragma once
#include <SDL2/SDL.h>
#include <vector>
#include <string>
#include "jail_audio.h"
// Estructura para almacenar ficheros de sonido y su nombre
struct ResourceSound
{
std::string name; // Nombre del sonido
JA_Sound_t *sound; // Fichero con el sonido
};
// Estructura para almacenar ficheros musicales y su nombre
struct ResourceMusic
{
std::string name; // Nombre de la musica
JA_Music_t *music; // Fichero con la música
};
class Resource
{
private:
// [SINGLETON] Objeto resource privado para Don Melitón
static Resource *resource_;
std::vector<ResourceSound> sounds_; // Vector con los sonidos
std::vector<ResourceMusic> musics_; // Vector con las musicas
// Carga los sonidos del juego
void loadSounds();
// Carga las musicas del juego
void loadMusics();
// [SINGLETON] Ahora el constructor y el destructor son privados, para no poder crear objetos resource desde fuera
// Constructor
Resource();
// Destructor
~Resource();
public:
// [SINGLETON] Crearemos el objeto resource con esta función estática
static void init();
// [SINGLETON] Destruiremos el objeto resource con esta función estática
static void destroy();
// [SINGLETON] Con este método obtenemos el objeto resource y podemos trabajar con él
static Resource *get();
// Obtiene el fichero de sonido a partir de un nombre
JA_Sound_t *getSound(const std::string &name);
// Obtiene el fichero de música a partir de un nombre
JA_Music_t *getMusic(const std::string &name);
};

View File

@@ -15,6 +15,7 @@
#include "notifier.h" // for Notifier
#include "options.h" // for options
#include "param.h" // for param
#include "resource.h" // for Resource
#include "screen.h" // for Screen
#include "section.h" // for Options, options, Name, name
#include "texture.h" // for Texture
@@ -22,13 +23,10 @@
struct JA_Music_t; // lines 17-17
// Constructor
Title::Title(JA_Music_t *music)
: music_(music)
Title::Title()
{
// Copia las direcciones de los punteros y objetos
input_ = Input::get();
screen_ = Screen::get();
SDL_Renderer *renderer = screen_->getRenderer();
SDL_Renderer *renderer = Screen::get()->getRenderer();
// Reserva memoria y crea los objetos
fade_ = std::make_unique<Fade>(renderer);
@@ -66,7 +64,7 @@ void Title::init()
fade_->setType(FadeType::RANDOM_SQUARE);
fade_->setPost(param.fade.post_duration);
demo_ = true;
num_controllers_ = input_->getNumControllers();
num_controllers_ = Input::get()->getNumControllers();
}
// Actualiza las variables del objeto
@@ -79,7 +77,7 @@ void Title::update()
ticks_ = SDL_GetTicks();
// Actualiza el objeto screen
screen_->update();
Screen::get()->update();
// Comprueba el fade_ y si se ha acabado
fade_->update();
@@ -116,7 +114,7 @@ void Title::update()
// Reproduce la música
if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED))
{
JA_PlayMusic(music_);
JA_PlayMusic(Resource::get()->getMusic("title.ogg"));
}
// Actualiza el logo con el título del juego
@@ -138,10 +136,10 @@ void Title::update()
void Title::render()
{
// Prepara para empezar a dibujar en la textura de juego
screen_->start();
Screen::get()->start();
// Limpia la pantalla
screen_->clean(bg_color);
Screen::get()->clean(bg_color);
// Dibuja el mosacico de fondo
tiled_bg_->render();
@@ -176,7 +174,7 @@ void Title::render()
fade_->render();
// Vuelca el contenido del renderizador en pantalla
screen_->blit();
Screen::get()->blit();
}
// Comprueba los eventos
@@ -241,7 +239,7 @@ void Title::checkInput()
if (!define_buttons_->isEnabled())
{
// Comprueba el teclado para empezar a jugar
if (input_->checkInput(InputType::START, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_KEYBOARD))
if (Input::get()->checkInput(InputType::START, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_KEYBOARD))
{
if (section::options == section::Options::TITLE_2 || ALLOW_TITLE_ANIMATION_SKIP)
{
@@ -251,27 +249,27 @@ void Title::checkInput()
}
// Comprueba los mandos
for (int i = 0; i < input_->getNumControllers(); ++i)
for (int i = 0; i < Input::get()->getNumControllers(); ++i)
{
// Comprueba si se va a intercambiar la asignación de mandos a jugadores
if (input_->checkModInput(InputType::SERVICE, InputType::SWAP_CONTROLLERS, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_GAMECONTROLLER, i))
if (Input::get()->checkModInput(InputType::SERVICE, InputType::SWAP_CONTROLLERS, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_GAMECONTROLLER, i))
{
swapControllers();
return;
}
// Comprueba si algun mando quiere ser configurado
if (input_->checkModInput(InputType::SERVICE, InputType::CONFIG, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_GAMECONTROLLER, i))
if (Input::get()->checkModInput(InputType::SERVICE, InputType::CONFIG, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_GAMECONTROLLER, i))
{
define_buttons_->enable(i);
return;
}
// Comprueba el botón de START de los mandos
if (input_->checkInput(InputType::START, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_GAMECONTROLLER, i))
if (Input::get()->checkInput(InputType::START, INPUT_DO_NOT_ALLOW_REPEAT, INPUT_USE_GAMECONTROLLER, i))
{
// Si no está el botón de servicio activo
if (!input_->checkInput(InputType::SERVICE, INPUT_ALLOW_REPEAT, INPUT_USE_GAMECONTROLLER, i))
if (!Input::get()->checkInput(InputType::SERVICE, INPUT_ALLOW_REPEAT, INPUT_USE_GAMECONTROLLER, i))
{
if (section::options == section::Options::TITLE_2 || ALLOW_TITLE_ANIMATION_SKIP)
{
@@ -285,7 +283,7 @@ void Title::checkInput()
}
// Comprueba el input para el resto de objetos
screen_->checkInput();
Screen::get()->checkInput();
define_buttons_->checkInput();
// Comprueba los inputs que se pueden introducir en cualquier sección del juego
@@ -320,7 +318,7 @@ void Title::resetCounter()
// Intercambia la asignación de mandos a los jugadores
void Title::swapControllers()
{
const auto num_controllers = input_->getNumControllers();
const auto num_controllers = Input::get()->getNumControllers();
if (num_controllers == 0)
{

View File

@@ -40,8 +40,6 @@ class Title
{
private:
// Objetos y punteros
Screen *screen_; // Objeto encargado de dibujar en pantalla
Input *input_; // Objeto para leer las entradas de teclado o mando
std::unique_ptr<Tiledbg> tiled_bg_; // Objeto para dibujar el mosaico animado de fondo
std::unique_ptr<GameLogo> game_logo_; // Objeto para dibujar el logo con el título del juego
std::unique_ptr<DefineButtons> define_buttons_; // Objeto para definir los botones del joystic
@@ -52,8 +50,6 @@ private:
std::unique_ptr<Text> text2_; // Objeto de texto para poder escribir textos en pantalla
std::unique_ptr<Fade> fade_; // Objeto para realizar fundidos en pantalla
JA_Music_t *music_; // Musica para el titulo
// Variable
int counter_; // Temporizador para la pantalla de titulo
Uint32 ticks_; // Contador de ticks para ajustar la velocidad del programa
@@ -89,7 +85,7 @@ private:
public:
// Constructor
explicit Title(JA_Music_t *music);
Title();
// Destructor
~Title() = default;

View File

@@ -104,38 +104,6 @@ std::string toLower(const std::string &str)
return result;
}
// Obtiene el fichero de sonido a partir de un nombre
JA_Sound_t *getSound(const std::vector<SoundFile> &sounds, const std::string &name)
{
for (const auto &s : sounds)
{
if (s.name == name)
{
return s.file;
}
}
return nullptr;
}
// Obtiene el fichero de música a partir de un nombre
JA_Music_t *getMusic(const std::vector<MusicFile> &music, const std::string &name)
{
for (const auto &m : music)
{
if (m.name == name)
{
return m.file;
}
}
return nullptr;
}
// Ordena las entradas de la tabla de records
HiScoreEntry sortHiScoreTable(const HiScoreEntry &entry1, const HiScoreEntry &entry2)
{
return (entry1.score > entry2.score) ? entry1 : entry2;
}
// Dibuja un circulo
void DrawCircle(SDL_Renderer *renderer, int32_t centerX, int32_t centerY, int32_t radius)
{

View File

@@ -215,19 +215,6 @@ struct Param
ParamNotification notification; // Opciones para las notificaciones
};
// Estructura para almacenar ficheros de sonido y su nombre
struct SoundFile
{
std::string name; // Nombre del sonido
JA_Sound_t *file; // Fichero con el sonido
};
// Estructura para almacenar ficheros musicales y su nombre
struct MusicFile
{
std::string name; // Nombre de la musica
JA_Music_t *file; // Fichero con la música
};
// Calcula el cuadrado de la distancia entre dos puntos
double distanceSquared(int x1, int y1, int x2, int y2);
@@ -256,15 +243,6 @@ std::string boolToOnOff(bool value);
// Convierte una cadena a minusculas
std::string toLower(const std::string &str);
// Obtiene el fichero de sonido a partir de un nombre
JA_Sound_t *getSound(const std::vector<SoundFile> &sounds, const std::string &name);
// Obtiene el fichero de música a partir de un nombre
JA_Music_t *getMusic(const std::vector<MusicFile> &music, const std::string &name);
// Ordena las entradas de la tabla de records
HiScoreEntry sortHiScoreTable(const HiScoreEntry &entry1, const HiScoreEntry &entry2);
// Dibuja un circulo
void DrawCircle(SDL_Renderer *renderer, int32_t centerX, int32_t centerY, int32_t radius);