NumberSetting.observe

This commit is contained in:
MihailRis 2024-04-01 18:36:31 +03:00
parent f8ec75b121
commit 7374013eeb
3 changed files with 31 additions and 14 deletions

View File

@ -3,8 +3,10 @@
#include <limits>
#include <string>
#include <vector>
#include "../typedefs.h"
#include "../delegates.h"
enum class setting_format {
simple, percent
@ -34,6 +36,7 @@ protected:
number_t value;
number_t min;
number_t max;
std::vector<consumer<number_t>> consumers;
public:
NumberSetting(
number_t value,
@ -56,7 +59,13 @@ public:
}
void set(number_t value) {
if (value == this->value) {
return;
}
this->value = value;
for (auto& callback : consumers) {
callback(value);
}
}
number_t getMin() const {
@ -71,6 +80,10 @@ public:
return (value - min) / (max - min);
}
void observe(consumer<number_t> callback) {
consumers.push_back(callback);
}
virtual void resetToDefault() override {
value = initial;
}

View File

@ -7,6 +7,7 @@
using runnable = std::function<void()>;
template<class T> using supplier = std::function<T()>;
template<class T> using consumer = std::function<void(T)>;
// data sources
using wstringsupplier = std::function<std::wstring()>;

View File

@ -63,6 +63,22 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths)
audio::create_channel("ambient");
audio::create_channel("ui");
settings.audio.volumeMaster.observe([=](auto value) {
audio::get_channel("master")->setVolume(value*value);
});
settings.audio.volumeRegular.observe([=](auto value) {
audio::get_channel("regular")->setVolume(value*value);
});
settings.audio.volumeUI.observe([=](auto value) {
audio::get_channel("ui")->setVolume(value*value);
});
settings.audio.volumeAmbient.observe([=](auto value) {
audio::get_channel("ambient")->setVolume(value*value);
});
settings.audio.volumeMusic.observe([=](auto value) {
audio::get_channel("music")->setVolume(value*value);
});
auto resdir = paths->getResources();
std::cout << "-- loading assets" << std::endl;
std::vector<fs::path> roots {resdir};
@ -128,19 +144,6 @@ void Engine::updateHotkeys() {
}
}
inline constexpr float sqr(float x) {
return x*x;
}
static void updateAudio(double delta, const AudioSettings& settings) {
audio::get_channel("master")->setVolume(sqr(settings.volumeMaster.get()));
audio::get_channel("regular")->setVolume(sqr(settings.volumeRegular.get()));
audio::get_channel("ui")->setVolume(sqr(settings.volumeUI.get()));
audio::get_channel("ambient")->setVolume(sqr(settings.volumeAmbient.get()));
audio::get_channel("music")->setVolume(sqr(settings.volumeMusic.get()));
audio::update(delta);
}
void Engine::mainloop() {
setScreen(std::make_shared<MenuScreen>(this));
@ -152,7 +155,7 @@ void Engine::mainloop() {
assert(screen != nullptr);
updateTimers();
updateHotkeys();
updateAudio(delta, settings.audio);
audio::update(delta);
gui->act(delta);
screen->update(delta);