101 lines
2.5 KiB
C++
101 lines
2.5 KiB
C++
/* +------------------------------------------------------+
|
|
____/ \____ /| - Open source game framework licensed to freely use, |
|
|
\ / / | copy, modify and sell without restriction |
|
|
+--\ ^__^ /--+ | |
|
|
| ~/ \~ | | - created for <https://foam.shampoo.ooo> |
|
|
| ~~~~~~~~~~~~ | +------------------------------------------------------+
|
|
| SPACE ~~~~~ | /
|
|
| ~~~~~~~ BOX |/
|
|
+-------------*/
|
|
|
|
#pragma once
|
|
|
|
#include <regex>
|
|
#include <map>
|
|
#include "SDL.h"
|
|
#include "SDL_mixer.h"
|
|
#include "filesystem.hpp"
|
|
#include "Node.hpp"
|
|
#include "Animation.hpp"
|
|
#include "extension.hpp"
|
|
|
|
struct BGM : Node
|
|
{
|
|
|
|
Mix_Music* music;
|
|
float volume = 1.0f;
|
|
|
|
BGM();
|
|
BGM(Node*);
|
|
BGM(Node*, const fs::path&);
|
|
BGM(const fs::path&);
|
|
void load_music(const fs::path&);
|
|
void set_volume(float);
|
|
void play(int = -1);
|
|
~BGM();
|
|
|
|
};
|
|
|
|
struct SoundEffect : Node
|
|
{
|
|
|
|
Mix_Chunk* chunk = nullptr;
|
|
int channel, loops = 0;
|
|
float volume = 1.0f;
|
|
Animation play_animation = Animation(&SoundEffect::play, this);
|
|
|
|
SoundEffect(Node*);
|
|
SoundEffect();
|
|
SoundEffect(Node*, const fs::path&);
|
|
SoundEffect(const fs::path&);
|
|
void load_chunk(const fs::path&);
|
|
void play(float);
|
|
void play();
|
|
void play_after(float);
|
|
void set_volume(float);
|
|
void set_loop_count(int);
|
|
void set_loop_forever();
|
|
bool playing(bool = false) const;
|
|
void update(float timestamp);
|
|
~SoundEffect();
|
|
|
|
};
|
|
|
|
struct Audio : Node
|
|
{
|
|
|
|
std::map<std::string, SoundEffect> sfx;
|
|
std::map<std::string, BGM> bgm;
|
|
|
|
Audio(Node*);
|
|
void load_sfx();
|
|
void load_bgm();
|
|
void update(float timestamp);
|
|
|
|
template <typename T>
|
|
void load_directory(const fs::path& root, std::map<std::string, T>& storage, Node* parent = nullptr)
|
|
{
|
|
SDL_Log("looking for audio files in %s", root.c_str());
|
|
if (fs::exists(root))
|
|
{
|
|
for (const fs::path& path : sb::glob(root / ".*"))
|
|
{
|
|
std::regex pattern("([^.]+).*$");
|
|
std::smatch match;
|
|
std::string basename = path.filename();
|
|
if (std::regex_match(basename, match, pattern))
|
|
{
|
|
std::string key = match[1].str();
|
|
SDL_Log("loading %s as %s", path.c_str(), key.c_str());
|
|
storage.try_emplace(key, parent, path);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
#include "Box.hpp"
|
|
#include "Configuration.hpp"
|
|
#include "Display.hpp"
|