1 #include "music.h" 2 #include "fps.h" 3 4 //グローバル変数 5 Music titleBGM; //タイトルBGM 6 Music playBGM; //プレイBGM 7 Music resultBGM; //リザルトBGM 8 //SE 9 Music buttonSE; //ボタンSE 10 Music hitSE_01; //ヒット時のSE 11 Music hitSE_02; //ヒット時のSE 12 13 //音楽の初期化(読み込み・ハンドル生成) 14 bool MusicInit() 15 { 16 //BGM 17 titleBGM = MusicLoad(MUSIC_PATH_TITLE_BGM, MUSIC_VOLUME_BGM, DX_PLAYTYPE_LOOP); 18 if (titleBGM.Handle == -1) 19 { 20 return false; 21 } 22 23 playBGM = MusicLoad(MUSIC_PATH_PLAY_BGM, MUSIC_VOLUME_BGM, DX_PLAYTYPE_LOOP); 24 if (playBGM.Handle == -1) 25 { 26 return false; 27 } 28 29 resultBGM = MusicLoad(MUSIC_PATH_RESULT_BGM, MUSIC_VOLUME_BGM, DX_PLAYTYPE_LOOP); 30 if (resultBGM.Handle == -1) 31 { 32 return false; 33 } 34 35 //SE 36 buttonSE = MusicLoad(MUSIC_PATH_BUTTON_SE, MUSIC_VOLUME_SE, DX_PLAYTYPE_BACK); 37 if (buttonSE.Handle == -1) 38 { 39 return false; 40 } 41 hitSE_01 = MusicLoad(MUSIC_PATH_Hit_SE_01, MUSIC_VOLUME_SE, DX_PLAYTYPE_BACK); 42 if (hitSE_01.Handle == -1) 43 { 44 return false; 45 } 46 hitSE_02 = MusicLoad(MUSIC_PATH_Hit_SE_02, MUSIC_VOLUME_SE, DX_PLAYTYPE_BACK); 47 if (hitSE_02.Handle == -1) 48 { 49 return false; 50 } 51 52 return true; 53 } 54 55 //音楽の終了 56 void MusicEnd() 57 { 58 MusicDelete(titleBGM); 59 MusicDelete(playBGM); 60 MusicDelete(resultBGM); 61 MusicDelete(buttonSE); 62 MusicDelete(hitSE_01); 63 MusicDelete(hitSE_02); 64 } 65 66 /// 音楽の読み込みエラーメッセージ 67 /// @param path ファイルのパス 68 void MusicLoadErrMessage(const char* path) 69 { 70 //エラーメッセージ用文字列 71 char ErrStr[MUSIC_ERR_STR_MAX]; 72 73 //エラーメッセージ用文字列の内容を空にする 74 for (int i = 0; i < MUSIC_ERR_STR_MAX; i++) 75 { 76 ErrStr[i] = '\0'; 77 } 78 79 //エラーメッセージ内容を連結して生成 80 sprintf_s(ErrStr, sizeof(ErrStr), "%s%s", path, MUSIC_LOAD_ERR_CAP); 81 82 //エラーメッセージ表示 83 MessageBox( 84 GetMainWindowHandle(), //ウィンドウのハンドル 85 ErrStr, //エラーメッセージ 86 MUSIC_LOAD_ERR_TITLE, //エラータイトル 87 MB_OK); //OKボタンのみ 88 89 } 90 91 /// 音楽の読み込み 92 /// @param path ファイルのパス 93 /// @param volume 音量 94 /// @param playType 再生タイプ 95 Music MusicLoad(const char* path, int volume, int playType) 96 { 97 Music music; 98 //ファイルの場所をコピー 99 strcpy_s(music.Path, sizeof(music.Path), path); 100 101 //音楽をメモリに読み込む 102 music.Handle = LoadSoundMem(music.Path); 103 104 //読み込めなかった場合 105 if (music.Handle == -1) 106 { 107 MusicLoadErrMessage(music.Path); 108 }else 109 { 110 //読み込めた場合 111 music.Volume=volume; //最大音量を設定 112 ChangeMusicVolume(&music, music.Volume);//再生音量を設定 113 music.PlayType = playType; //再生タイプを設定 114 music.IsPlayStart = true; //停止後は最初から再生 115 } 116 117 return music; 118 } 119 120 /// 音楽の再生 121 /// @param music 音楽データ 122 void MusicPlay(Music music) 123 { 124 switch (music.PlayType) 125 { 126 case DX_PLAYTYPE_BACK: 127 //バックグラウンド再生 128 PlaySoundMem(music.Handle, DX_PLAYTYPE_BACK, music.IsPlayStart); 129 break; 130 case DX_PLAYTYPE_LOOP: 131 //ループ再生 132 //再生されていないなら 133 if(CheckSoundMem(music.Handle) == 0) 134 { 135 //ループ再生する 136 PlaySoundMem(music.Handle, DX_PLAYTYPE_LOOP, music.IsPlayStart); 137 } 138 break; 139 default: 140 break; 141 } 142 } 143 144 /// 音楽の一時停止 145 /// @param music 一時停止する音楽 146 void MusicPause(Music* music) 147 { 148 //停止後は今の再生位置から再生する 149 music->IsPlayStart = false; 150 151 //再生されているかどうか 152 if (CheckSoundMem(music->Handle)) 153 { 154 //音楽の一時停止 155 StopSoundMem(music->Handle); 156 157 //マスター音量に戻す 158 ChangeVolumeSoundMem(GetVolume(music->Volume), music->Handle); 159 160 //フェード初期化 161 music->FadeInStartFlg = false; 162 music->FadeOutStartFlg = false; 163 } 164 165 return; 166 } 167 168 /// 音楽の停止 169 /// @param music 停止する音楽 170 void MusicStop(Music* music) 171 { 172 //停止後は最初から再生する 173 music->IsPlayStart = true; 174 175 //再生されているかどうか 176 if (CheckSoundMem(music->Handle)) 177 { 178 //音楽の一時停止 179 StopSoundMem(music->Handle); 180 181 //マスター音量に戻す 182 ChangeVolumeSoundMem(GetVolume(music->Volume), music->Handle); 183 184 //フェード初期化 185 music->FadeInStartFlg = false; 186 music->FadeOutStartFlg = false; 187 } 188 return; 189 190 } 191 192 /// 音楽の削除 193 /// @param music 削除する音楽 194 void MusicDelete(Music music) 195 { 196 //正常に読み込んでた場合 197 if (music.Handle != -1) 198 { 199 //音楽をメモリから削除 200 DeleteSoundMem(music.Handle); 201 } 202 } 203 204 /// 音楽の音量変更 205 /// @param music 音楽データ 206 /// @param volume 音量 207 void ChangeMusicVolume(Music* music, int volume) 208 { 209 //音量が最大音量を超えていたら 210 if(volume <= music->Volume) 211 { 212 //ボリュームを変更 213 ChangeVolumeSoundMem(GetVolume(volume), music->Handle); 214 215 } 216 217 return; 218 } 219 220 /// フェードイン中かどうか 221 /// @param music 音楽データ 222 /// @param fadeInMillTime フェードイン時間(1000=1秒) 223 /// @return true フェードイン終了 false フェードイン中 224 bool FadeInPlayMusic(Music* music, int fadeInMillTime) 225 { 226 //初めてフェードインを行う 227 if (!music->FadeInStartFlg) 228 { 229 //フェードイン時間を設定 230 music->FadeInMillTime = 0; 231 music->FadeInMillTimeMax = (fadeInMillTime/1000.0f) * GAME_FPS; 232 //音量を0にする 233 ChangeMusicVolume(music, 0); 234 //音楽の再生 235 MusicPlay(*music); 236 //フェードイン開始 237 music->FadeInStartFlg = true; 238 } 239 240 //フェードイン中 241 if(music->FadeInStartFlg) 242 { 243 if(music->FadeInMillTime <= music->FadeInMillTimeMax) 244 { 245 //フェードイン時間をカウントアップ 246 music->FadeInMillTime++; 247 248 //音量を変更(経過時間/最大時間 * 最大音量) 249 ChangeMusicVolume(music, 250 (float)music->FadeInMillTime/music->FadeInMillTimeMax * music->Volume); 251 } 252 else if(music->FadeInMillTime >= music->FadeInMillTimeMax) 253 { 254 //フェードイン終了 255 return true; 256 } 257 } 258 return false; 259 } 260 261 /// フェードアウト中かどうか 262 /// @param music 音楽データ 263 /// @param fadeOutMillTime フェードアウト時間(1000=1秒) 264 /// @return true フェードアウト終了 false フェードアウト中 265 bool FadeOutPlayMusic(Music* music, int fadeOutMillTime) 266 { 267 //初めてフェードアウトを行う 268 if (!music->FadeOutStartFlg) 269 { 270 //フェードアウト時間を設定 271 music->FadeOutMillTime = 0; 272 music->FadeOutMillTimeMax = (fadeOutMillTime/1000.0f) * GAME_FPS; 273 274 //音量を最大にする 275 ChangeMusicVolume(music, music->Volume); 276 //音楽を再生 277 MusicPlay(*music); 278 //フェードアウト開始 279 music->FadeOutStartFlg = true; 280 } 281 282 if (music->FadeOutStartFlg) 283 { 284 if (music->FadeOutMillTime <= music->FadeOutMillTimeMax) 285 { 286 //フェードアウト時間をカウントアップ 287 music->FadeOutMillTime++; 288 289 //音量を変更(100%-(経過時間/最大時間 * 最大音量)) 290 ChangeMusicVolume(music, 291 (1 - (float)music->FadeOutMillTime / music->FadeOutMillTimeMax) * music->Volume); 292 return false; 293 } 294 else if (music->FadeOutMillTime >= music->FadeOutMillTimeMax) 295 { 296 //フェードアウト終了 297 return true; 298 } 299 } 300 return false; 301 } 302 303 304 305 306