The next little game in the series where I make a fancy rogue game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
roguish/sound.cpp

42 lines
1.3 KiB

#include "sound.hpp"
#include "dbc.hpp"
#include <fmt/core.h>
using namespace fmt;
using std::make_shared;
namespace fs = std::filesystem;
SoundManager::SoundManager(std::string base_path) : $base_path(base_path) {
dbc::check(fs::exists($base_path), "sound asset path is missing");
}
void SoundManager::load(const std::string name, const std::string sound_path) {
// get the sound file with base_path
fs::path full_path = $base_path / sound_path;
// confirm it's there
dbc::check(fs::exists(full_path), fmt::format("sound file {} does not exist", sound_path));
// create the buffer and keep in the buffer map
auto buffer = make_shared<sf::SoundBuffer>(full_path);
// set it on the sound and keep in the sound map
auto sound = make_shared<sf::Sound>(*buffer);
sound->setRelativeToListener(false);
sound->setPosition({0.0f, 0.0f, 1.0f});
$sounds.try_emplace(name, buffer, sound);
}
void SoundManager::play(const std::string name) {
dbc::check($sounds.contains(name), fmt::format("sound {} is not loaded in map", name));
// get the sound from the sound map
auto pair = $sounds.at(name);
// play it
pair.sound->play();
}
void SoundManager::playAt(const std::string name, float x, float y, float z) {
auto pair = $sounds.at(name);
pair.sound->setPosition({x, y, z});
pair.sound->play();
}