diff --git a/CMakeLists.txt b/CMakeLists.txt index 71343bba..19a5e613 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,6 +67,10 @@ set(SOURCES sources/Component/Collision/CollisionComponent.hpp sources/System/Collision/CollisionSystem.hpp sources/System/Collision/CollisionSystem.cpp + sources/Component/Music/MusicComponent.cpp + sources/Component/Music/MusicComponent.hpp + sources/System/Music/PlayerMusicManagerSystem.cpp + sources/System/Music/PlayerMusicManagerSystem.hpp ) add_executable(bomberman sources/main.cpp diff --git a/assets/sounds/bomb_drop.ogg b/assets/sounds/bomb_drop.ogg new file mode 100644 index 00000000..40288f0e Binary files /dev/null and b/assets/sounds/bomb_drop.ogg differ diff --git a/assets/sounds/death.ogg b/assets/sounds/death.ogg new file mode 100644 index 00000000..b5822604 Binary files /dev/null and b/assets/sounds/death.ogg differ diff --git a/assets/sounds/new_death.ogg b/assets/sounds/new_death.ogg new file mode 100644 index 00000000..15fa82ca Binary files /dev/null and b/assets/sounds/new_death.ogg differ diff --git a/sources/Component/Music/MusicComponent.cpp b/sources/Component/Music/MusicComponent.cpp index f31bfe16..48daf6c3 100644 --- a/sources/Component/Music/MusicComponent.cpp +++ b/sources/Component/Music/MusicComponent.cpp @@ -1,56 +1,93 @@ -/* -** EPITECH PROJECT, 2021 -** Bomberman -** File description: -** MusicComponent -*/ +// +// Created by Tom Augier on 05/06/2021 +// +#include #include "MusicComponent.hpp" - namespace BBM { - MusicComponent::MusicComponent(WAL::Entity &entity, std::string &path) + MusicComponent::MusicComponent(WAL::Entity &entity, \ +std::map &musicPath) : WAL::Component(entity), - _musicPath(path) - {} + _musicIndex(IDLE) + { + for (int i = 0; i < DEATH + 1; i++) { + if (musicPath.at(static_cast(i)).empty()) { + this->_isLoad[static_cast(i)] = false; + } else { + this->_isLoad[static_cast(i)] = true; + this->_musicList[static_cast(i)] = RAY::Audio::Music(musicPath.at(static_cast(i))); + } + } + } + + MusicComponent::MusicComponent(WAL::Entity &entity) + : Component(entity), + _musicList(), + _musicIndex() + {} WAL::Component *MusicComponent::clone(WAL::Entity &entity) const { return new MusicComponent(entity); } - void MusicComponent::loadMusic(void) - { - this->_music = RAY::Audio::Music(this->_musicPath); - this->_music.play(); + { + if (!this->_isLoad.at(this->_musicIndex)) + return; + if (!this->_musicList[this->_musicIndex].isPlaying()) { + std::cout << this->_musicIndex << std::endl; + this->_musicList[this->_musicIndex].play(); + } } void MusicComponent::unloadMusic(void) { - this->_music.stop(); + if (!this->_isLoad.at(this->_musicIndex)) + return; + if (!this->_musicList[this->_musicIndex].isPlaying()) + this->_musicList[this->_musicIndex].stop(); } void MusicComponent::pauseMusic(void) { - this->_music.pause(); + if (!this->_isLoad.at(this->_musicIndex)) + return; + this->_musicList[this->_musicIndex].pause(); } void MusicComponent::setVolume(float &volume) { - this->_music.setVolume(volume); + if (!this->_isLoad.at(this->_musicIndex)) + return; + if (volume >= 0) + this->_musicList[this->_musicIndex].setVolume(volume); } void MusicComponent::setPitch(float &pitch) { - this->_music.setPitch(pitch); + if (!this->_isLoad.at(this->_musicIndex)) + return; + this->_musicList[this->_musicIndex].setPitch(pitch); } bool MusicComponent::isPlaying(void) { - return (this->_music.isPlaying()); + if (!this->_isLoad.at(this->_musicIndex)) + return (false); + return (this->_musicList[this->_musicIndex].isPlaying()); } + void MusicComponent::setIndex(musicIndex index) + { + this->_musicIndex = index; + } + + MusicComponent::musicIndex MusicComponent::getIndex(void) + { + return (this->_musicIndex); + } } // namespace WAL diff --git a/sources/Component/Music/MusicComponent.hpp b/sources/Component/Music/MusicComponent.hpp index c15335ec..7cb48fed 100644 --- a/sources/Component/Music/MusicComponent.hpp +++ b/sources/Component/Music/MusicComponent.hpp @@ -1,28 +1,34 @@ // -// Created by Zoe Roux on 5/17/21. +// Created by Tom Augier on 05/06/2021 // #pragma once -#include "Models/Vector3.hpp" #include "Component/Component.hpp" -#include "Music.hpp" +#include +#include "Audio/Music.hpp" namespace BBM { //! @brief A basic Music component class MusicComponent : public WAL::Component { - private: - //! @brief music of this entity - RAY::Audio::Music _music; - //! @brief path to the music - std::string _musicPath; - //! @brief Create a new MusicComponent linked to a specific entity - explicit MusicComponent(WAL::Entity &entity); - public: + enum musicIndex { + IDLE, + JUMP, + BOMB, + MOVE, + HURT, + THROW, + DEATH, + }; + + void setIndex(musicIndex index); + + musicIndex getIndex(); + //! @brief load music void loadMusic(); @@ -41,15 +47,28 @@ namespace BBM //! @brief is music playing bool isPlaying(void); + //! @inherit WAL::Component *clone(WAL::Entity &entity) const override; //! @brief Create a new MusicComponent at a certain Music - MusicComponent(WAL::Entity &entity, std::string &musicPath); + MusicComponent(WAL::Entity &entity, std::map &musicPath); //! @brief A Music component is copy constructable MusicComponent(const MusicComponent &) = default; //! @brief A default destructor ~MusicComponent() override = default; //! @brief A Music component is not assignable MusicComponent &operator=(const MusicComponent &) = delete; + private: + //! @brief music of this entity + std::map _musicList; + + std::map _isLoad; + //! musicIndex + musicIndex _musicIndex; + //! @brief Create a new MusicComponent linked to a specific entity + explicit MusicComponent(WAL::Entity &entity); + + }; -} // namespace WAL \ No newline at end of file + +} // namespace BBM \ No newline at end of file diff --git a/sources/Runner/Runner.cpp b/sources/Runner/Runner.cpp index cd5b30e1..74b807e1 100644 --- a/sources/Runner/Runner.cpp +++ b/sources/Runner/Runner.cpp @@ -29,6 +29,7 @@ #include "Component/Animation/AnimationsComponent.hpp" #include "System/Animation/AnimationsSystem.hpp" #include "Map/Map.hpp" +#include "Component/Music/MusicComponent.hpp" namespace RAY2D = RAY::Drawables::Drawables2D; namespace RAY3D = RAY::Drawables::Drawables3D; @@ -64,6 +65,15 @@ namespace BBM std::shared_ptr loadGameScene() { auto scene = std::make_shared(); + std::map musicPath= { + {MusicComponent::IDLE, ""}, + {MusicComponent::JUMP, ""}, + {MusicComponent::BOMB, ""}, + {MusicComponent::MOVE, "assets/sounds/new_death.ogg"}, + {MusicComponent::HURT, ""}, + {MusicComponent::THROW, ""}, + {MusicComponent::DEATH, ""} + }; scene->addEntity("player") .addComponent() .addComponent("assets/player/player.iqm", std::make_pair(MAP_DIFFUSE, "assets/player/blue.png")) @@ -71,7 +81,8 @@ namespace BBM .addComponent() .addComponent(RAY::ModelAnimations("assets/player/player.iqm"), 1) .addComponent(2) - .addComponent(); + .addComponent() + .addComponent(musicPath); scene->addEntity("cube") .addComponent(-5, 0, -5) .addComponent(Vector3f(-5, 0, -5), Vector3f(3, 3, 3), RED) diff --git a/sources/System/Music/PlayerMusicManagerSystem.cpp b/sources/System/Music/PlayerMusicManagerSystem.cpp new file mode 100644 index 00000000..2d46b5ff --- /dev/null +++ b/sources/System/Music/PlayerMusicManagerSystem.cpp @@ -0,0 +1,26 @@ +// +// Created by Tom Augier on 05/06/2021 +// + +#include "PlayerMusicManagerSystem.hpp" + +namespace BBM { + + void MusicManagerSystem::onFixedUpdate(WAL::Entity &entity) + { + if (!entity.hasComponent()) + return; + const auto &controllable = entity.getComponent(); + auto &music = entity.getComponent(); + auto &health = entity.getComponent(); + + music.setIndex(MusicComponent::BOMB); + controllable.bomb ? music.loadMusic() : music.unloadMusic(); + music.setIndex(MusicComponent::JUMP); + controllable.jump ? music.loadMusic() : music.unloadMusic(); + music.setIndex(MusicComponent::MOVE); + (controllable.move.x != 0 || controllable.move.y != 0) ? music.loadMusic() : music.unloadMusic(); + music.setIndex(MusicComponent::DEATH); + health.getHealthPoint() == 0 ? music.loadMusic() : music.unloadMusic(); + } +} \ No newline at end of file diff --git a/sources/System/Music/PlayerMusicManagerSystem.hpp b/sources/System/Music/PlayerMusicManagerSystem.hpp new file mode 100644 index 00000000..7038549a --- /dev/null +++ b/sources/System/Music/PlayerMusicManagerSystem.hpp @@ -0,0 +1,31 @@ +// +// Created by Tom Augier on 05/06/2021 +// + +#pragma once + +#include "System/System.hpp" +#include "Window.hpp" +#include "Component/Music/MusicComponent.hpp" +#include "Component/Health/HealthComponent.hpp" +#include +#include "Wal.hpp" + +namespace BBM +{ + class MusicManagerSystem : public WAL::System + { + public: + //! @inherit + void onFixedUpdate(WAL::Entity &entity) override; + + //! @brief ctor + MusicManagerSystem(WAL::Wal &wal, RAY::Window &window); + //! @brief Default copy ctor + MusicManagerSystem(const MusicManagerSystem &) = default; + //! @brief Default dtor + ~MusicManagerSystem() override = default; + //! @brief A MusicManager screen system can't be assigned. + MusicManagerSystem &operator=(const MusicManagerSystem &) = delete; + }; +}