NumberSetting.observe
This commit is contained in:
@@ -3,8 +3,10 @@
|
|||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "../typedefs.h"
|
#include "../typedefs.h"
|
||||||
|
#include "../delegates.h"
|
||||||
|
|
||||||
enum class setting_format {
|
enum class setting_format {
|
||||||
simple, percent
|
simple, percent
|
||||||
@@ -34,6 +36,7 @@ protected:
|
|||||||
number_t value;
|
number_t value;
|
||||||
number_t min;
|
number_t min;
|
||||||
number_t max;
|
number_t max;
|
||||||
|
std::vector<consumer<number_t>> consumers;
|
||||||
public:
|
public:
|
||||||
NumberSetting(
|
NumberSetting(
|
||||||
number_t value,
|
number_t value,
|
||||||
@@ -56,7 +59,13 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void set(number_t value) {
|
void set(number_t value) {
|
||||||
|
if (value == this->value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
this->value = value;
|
this->value = value;
|
||||||
|
for (auto& callback : consumers) {
|
||||||
|
callback(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
number_t getMin() const {
|
number_t getMin() const {
|
||||||
@@ -71,6 +80,10 @@ public:
|
|||||||
return (value - min) / (max - min);
|
return (value - min) / (max - min);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void observe(consumer<number_t> callback) {
|
||||||
|
consumers.push_back(callback);
|
||||||
|
}
|
||||||
|
|
||||||
virtual void resetToDefault() override {
|
virtual void resetToDefault() override {
|
||||||
value = initial;
|
value = initial;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
using runnable = std::function<void()>;
|
using runnable = std::function<void()>;
|
||||||
template<class T> using supplier = std::function<T()>;
|
template<class T> using supplier = std::function<T()>;
|
||||||
|
template<class T> using consumer = std::function<void(T)>;
|
||||||
|
|
||||||
// data sources
|
// data sources
|
||||||
using wstringsupplier = std::function<std::wstring()>;
|
using wstringsupplier = std::function<std::wstring()>;
|
||||||
|
|||||||
+17
-14
@@ -63,6 +63,22 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths)
|
|||||||
audio::create_channel("ambient");
|
audio::create_channel("ambient");
|
||||||
audio::create_channel("ui");
|
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();
|
auto resdir = paths->getResources();
|
||||||
std::cout << "-- loading assets" << std::endl;
|
std::cout << "-- loading assets" << std::endl;
|
||||||
std::vector<fs::path> roots {resdir};
|
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() {
|
void Engine::mainloop() {
|
||||||
setScreen(std::make_shared<MenuScreen>(this));
|
setScreen(std::make_shared<MenuScreen>(this));
|
||||||
|
|
||||||
@@ -152,7 +155,7 @@ void Engine::mainloop() {
|
|||||||
assert(screen != nullptr);
|
assert(screen != nullptr);
|
||||||
updateTimers();
|
updateTimers();
|
||||||
updateHotkeys();
|
updateHotkeys();
|
||||||
updateAudio(delta, settings.audio);
|
audio::update(delta);
|
||||||
|
|
||||||
gui->act(delta);
|
gui->act(delta);
|
||||||
screen->update(delta);
|
screen->update(delta);
|
||||||
|
|||||||
Reference in New Issue
Block a user