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変換する式です。