BaseSoundManager実装例
以下に、BaseSoundManagerの具象化クラスを擬似コードで示します。
class SoundManagerImpl : public BaseSoundManager{
public:
//コンストラクタ
SoundManagerfD(CSoundSystem* SS){
m_SS = SS;
}
private:
//SEの音量を設定
void _SetSEVolume(long Volume){
for(map<string, CSound*>::iterator it=m_SE.begin();it!=m_SE.end();it++){
it->second->SetVolume(Volume==0 ? -10000 : static_cast<long>((10*log10(static_cast<double>(Volume)/10000))*100));
}
}
//SEを再生
bool _PlaySE(const char* FileName){
return(m_SE.find(FileName)->second->Play());
}
//SEを停止
bool _StopSE(const char* FileName){
return(m_SE.find(FileName)->second->Stop());
}
//SEをメモリに読み込む
bool _LoadSE(const char* FileName){
//各種チェック
if(strcmp(FileName, "")==0){
return(true);
}
if(m_SE.find(FileName)!=m_SE.end()){
return(true);
}
m_SE.insert(pair<string, CSound*>(FileName, new CSound(FileName)));
return(true);
}
//SEをメモリから解放する
bool _UnloadSE(const char* FileName){
delete(m_SE.find(FileName)->second);
m_SE.erase(m_SE.find(FileName));
return(true);
}
//SEが再生中かを確認する
bool _IsPlayingSE(const char* FileName) const{
return(m_SE.find(FileName)->second->IsPlaying());
}
//BGMの音量を設定
void _SetBGMVolume(long Volume){
m_BGM.SetVolume(Volume==0 ? -10000 : static_cast<long>((10*log10(static_cast<double>(Volume)/10000))*100));
}
//BGMを再生
bool _PlayBGM(bool IsOnce){
return(IsOnce ? m_BGM.Play() : m_BGM.LoopPlay());
}
//BGMを停止
bool _StopBGM(){
return(m_BGM.Stop());
}
//BGMをメモリに読み込む
bool _LoadBGM(const char* FileName){
//各種チェック
if(strcmp(FileName, "")==0){
return(true);
}
m_BGM.Load(FileName);
return(true);
}
//BGMをメモリから解放する
bool _UnloadBGM(){
m_BGM.Unload();
return(true);
}
//BGMが再生中かを確認する
bool _IsPlayingBGM() const{
return(m_BGM.IsPlaying());
}
//音声の音量を設定
void _SetVoiceVolume(long Volume){
for(map<string, CSound*>::iterator it=m_Voice.begin();it!=m_Voice.end();it++){
it->second->SetVolume(Volume==0 ? -10000 : static_cast<long>((10*log10(static_cast<double>(Volume)/10000))*100));
}
}
//音声を再生
bool _PlayVoice(const char* FileName){
return(m_Voice.find(FileName)->second->Play());
}
//音声を停止
bool _StopVoice(const char* FileName){
return(m_Voice.find(FileName)->second->Stop());
}
//音声をメモリに読み込む
bool _LoadVoice(const char* FileName){
//各種チェック
if(strcmp(FileName, "")==0){
return(true);
}
if(m_Voice.find(FileName)!=m_Voice.end()){
return(true);
}
m_Voice.insert(pair<string, CSound*>(FileName, new CSound(FileName)));
return(true);
}
//音声をメモリから解放する
bool _UnloadVoice(const char* FileName){
delete(m_Voice.find(FileName)->second);
m_Voice.erase(m_Voice.find(FileName));
return(true);
}
//音声が再生中かを確認する
bool _IsPlayingVoice(const char* FileName) const{
return(m_Voice.find(FileName)->second->IsPlaying());
}
CSoundSystem* m_SS; //サウンド再生システムクラスへのポインタ
map<string, CSound*> m_SE; //SE
CSound m_BGM; //BGM
map<string, CSound*> m_Voice; //音声
SoundManagerImpl(); //デフォルトコンストラクタ(禁止)
SoundManagerImpl(const SoundManagerImpl&); //コピーコンストラクタ(禁止)
SoundManagerImpl& operator =(const SoundManagerImpl&); //代入演算子(禁止)
};
※1:上記擬似コードは、Direct Xベースのライブラリで実装した場合を想定しています。
※2:static_cast<long>((10*log10(static_cast<double>(Volume)/10000))*100))
上記のコードは、引数として渡される0〜10000をDirectX向けにDb変換する式です。