From 9107e9e6c337fbd9790eeb7e89e473d5da129f36 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 13 Mar 2021 13:34:12 -0500 Subject: Music volume is controllable from settings menu #7 --- src/menu.h | 6 ++++++ src/menu_system.cpp | 19 +++++++++++++++++-- src/mixer.cpp | 7 +++++++ src/mixer.h | 5 +++++ 4 files changed, 35 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/menu.h b/src/menu.h index 9ef94be..7483d89 100644 --- a/src/menu.h +++ b/src/menu.h @@ -20,6 +20,7 @@ struct MenuItem { bool playSfx = true; int value = 0; int maxValue = 0; + std::function selectionChanged; }; class MenuBuilder { @@ -57,6 +58,11 @@ public: return *this; } + MenuBuilder& SelectionChangedFunction(std::function val) { + result_.selectionChanged = std::move(val); + return *this; + } + MenuItem Build() const { return result_; } diff --git a/src/menu_system.cpp b/src/menu_system.cpp index e1aca8d..c099afe 100644 --- a/src/menu_system.cpp +++ b/src/menu_system.cpp @@ -55,8 +55,15 @@ void MenuSystem::openPauseMenu() { .ActivationFunction([this] (Game&) { openSubmenu(Menu({ MenuBuilder().Slider("Music Volume: ") - .InitialValue(10) - .MaxValue(10), + .InitialValue(game_.getMixer().isMusicMuted() ? 0 : game_.getMixer().getMusicVolume()) + .MaxValue(10) + .SelectionChangedFunction([this] (MenuItem& menuItem) { + if (game_.getMixer().isMusicMuted()) { + menuItem.value = game_.getMixer().getMusicVolume(); + } + + game_.getMixer().setMusicVolume(menuItem.value); + }), MenuBuilder().Slider("Sound Volume: ") .InitialValue(10) .MaxValue(10), @@ -135,6 +142,10 @@ void MenuSystem::pressedLeft() { if (menuItem.type == MenuType::Slider && menuItem.value > 0) { menuItem.value--; + if (menuItem.selectionChanged) { + menuItem.selectionChanged(menuItem); + } + game_.getMixer().playSound("../res/sfx/horizontal_menu.wav"); } } @@ -146,6 +157,10 @@ void MenuSystem::pressedRight() { if (menuItem.type == MenuType::Slider && menuItem.value < menuItem.maxValue) { menuItem.value++; + if (menuItem.selectionChanged) { + menuItem.selectionChanged(menuItem); + } + game_.getMixer().playSound("../res/sfx/horizontal_menu.wav"); } } diff --git a/src/mixer.cpp b/src/mixer.cpp index 4e8f307..74a870a 100644 --- a/src/mixer.cpp +++ b/src/mixer.cpp @@ -1,4 +1,5 @@ #include "mixer.h" +#include void Mixer::playSound(std::string_view filename) { Mix_Chunk* chunk = getChunkByFilename(std::string(filename)); @@ -66,6 +67,12 @@ void Mixer::unmuteMusic() { musicMuted_ = false; } +void Mixer::setMusicVolume(int vol) { + musicVolume_ = MIX_MAX_VOLUME / 10.0 * vol; + musicMuted_ = false; + Mix_VolumeMusic(musicVolume_); +} + void Mixer::pauseMusic() { Mix_PauseMusic(); } diff --git a/src/mixer.h b/src/mixer.h index 854c67d..c2a0681 100644 --- a/src/mixer.h +++ b/src/mixer.h @@ -2,6 +2,7 @@ #define MIXER_H_6DF82000 #include +#include #include #include #include @@ -92,6 +93,10 @@ public: bool isMusicMuted() const { return musicMuted_; } + int getMusicVolume() const { return std::round(static_cast(musicVolume_) / MIX_MAX_VOLUME * 10); } + + void setMusicVolume(int vol); + void pauseMusic(); void unpauseMusic(); -- cgit 1.4.1