質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

1518閲覧

ゲームのBGMが切り替わらない

fkcz_yfm_carp

総合スコア4

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2021/06/15 08:40

前提・実現したいこと

DXライブラリを使用してゲームを制作しています。
タイトル画面、ゲーム画面などシーンごとに違うBGMを流そうとしています。

発生している問題・エラーメッセージ

プログラムは動いておりエラーメッセージも出ませんが、シーンが変わってもタイトルBGM(ゲームの最初に流れるBGM、Handle_bgm_a)が他のBGMに切り替わることなく延々と流れ続けてしまっています。

該当のソースコード

C++

1//Main.cpp 2 3#include "DxLib.h" 4#include "Main.h" 5#include "Title.h" 6#include "Game.h" 7#include "Result.h" 8#include "Credit.h" 9#include "Sound.h" 10#include "Player.h" 11#include "Enemy.h" 12#include "Collision.h" 13#include "Score.h" 14 15//初期ウィンドウサイズは640x480 16 17extern int Handle_bgm; 18 19char Key[256]; 20 21state nowpanel = STATE_TITLE; 22int movepanel = 0; 23 24bool titleroop = false; 25bool gameroop = false; 26bool resultroop = false; 27bool creditroop = false; 28 29void Main_Update() { 30 switch (nowpanel) { 31 case STATE_TITLE: 32 titleroop = true; 33 break; 34 case STATE_GAME: 35 gameroop = true; 36 break; 37 case STATE_RESULT: 38 resultroop = true; 39 break; 40 case STATE_CREDIT: 41 creditroop = true; 42 break; 43 default: 44 DxLib_End(); 45 break; 46 } 47 48 if (titleroop == true) { 49 Title_Update(); 50 } 51 if (gameroop == true) { 52 Game_Update(); 53 } 54 if (resultroop == true) { 55 Result_Update(); 56 } 57 if (creditroop == true) { 58 Credit_Update(); 59 } 60} 61 62void Main_Draw() { 63 if (titleroop == true) { 64 Title_Draw(); 65 } 66 if (gameroop == true) { 67 Game_Draw(); 68 } 69 if (resultroop == true) { 70 Result_Draw(); 71 } 72 if (creditroop == true) { 73 Credit_Draw(); 74 } 75} 76 77int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 78 LPSTR lpCmdLine, int nCmdShow) { 79 if (ChangeWindowMode(TRUE) != 0) { 80 return 0; 81 } 82 if (DxLib_Init() != 0) { 83 return 0; 84 } 85 if (SetDrawScreen(DX_SCREEN_BACK) != 0) { 86 return 0; 87 } 88 Sound__Initialize(); 89 PlaySoundMem(Handle_bgm, DX_PLAYTYPE_LOOP); 90 while (1) { 91 if (ScreenFlip() != 0) { 92 break; 93 } 94 if (ProcessMessage() != 0) { 95 break; 96 } 97 if (ClearDrawScreen() != 0) { 98 break; 99 } 100 if (GetHitKeyStateAll(Key) != 0) { 101 break; 102 } 103 if (nowpanel == STATE_GAME) { 104 SetBackgroundColor(0, 255, 0); 105 } else { 106 SetBackgroundColor(0, 0, 0); 107 } 108 Sound_Update(); 109 Game_Initialize(); 110 Main_Update(); 111 Main_Draw(); 112 Game_Finalize(); 113 } 114 return 0; 115} 116 117//-------------------------------------------------- 118 119//Main.h 120 121#ifndef DEF_MAIN_H 122 123#define DEF_MAIN_H 124 125enum state { 126 STATE_TITLE, STATE_GAME, STATE_RESULT, STATE_CREDIT, STATE_QUIT, 127}; 128 129void Main_Update(); 130 131void Main_Draw(); 132 133int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 134 LPSTR lpCmdLine, int nCmdShow); 135 136#endif 137 138//-------------------------------------------------- 139 140//Sound.cpp 141 142#include "DxLib.h" 143#include "Main.h" 144#include "Title.h" 145#include "Game.h" 146#include "Result.h" 147#include "Credit.h" 148#include "Sound.h" 149#include "Player.h" 150#include "Enemy.h" 151#include "Collision.h" 152#include "Score.h" 153 154extern char Key[256]; 155extern enum state nowpanel; 156extern bool titleroop; 157extern bool gameroop; 158extern bool resultroop; 159extern bool creditroop; 160 161int Handle_bgm_a; 162int Handle_bgm_b; 163int Handle_bgm_c; 164int Handle_bgm_d; 165int Handle_bgm; 166 167//初期化 168void Sound__Initialize() { 169 Handle_bgm_a = LoadSoundMem("./Audio/retrogamecenter.mp3"); 170 Handle_bgm_b = LoadSoundMem("./Audio/famipop3.mp3"); 171 Handle_bgm_c = LoadSoundMem("./Audio/illumination_am300.mp3"); 172 Handle_bgm_d = LoadSoundMem("./Audio/kagerou.mp3"); 173 Handle_bgm = Handle_bgm_a; 174} 175 176//計算 177void Sound_Update() { 178 switch (nowpanel) { 179 case STATE_TITLE: 180 if (titleroop == true) { 181 Handle_bgm = Handle_bgm_a; 182 } 183 break; 184 case STATE_GAME: 185 if (gameroop == true) { 186 Handle_bgm = Handle_bgm_b; 187 } 188 break; 189 case STATE_RESULT: 190 if (resultroop == true) { 191 Handle_bgm = Handle_bgm_c; 192 } 193 break; 194 case STATE_CREDIT: 195 if (creditroop == true) { 196 Handle_bgm = Handle_bgm_d; 197 } 198 break; 199 } 200} 201 202//-------------------------------------------------- 203 204//Sound.h 205 206#ifndef DEF_SOUND_H 207 208#define DEF_SOUND_H 209 210//初期化 211void Sound__Initialize(); 212 213//計算 214void Sound_Update(); 215 216#endif

試したこと

各BGM(Handle_bgm_a, Handle_bgm_b, Handle_bgm_c, Handle_bgm_d)の読み込み(LoadSoundMem)は問題なくできていることを既に確認しました。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual C++ 2019
DXライブラリ Windows版 Visual C++用 Ver3.22c

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

PlaySoundMem(Handle_bgm, DX_PLAYTYPE_LOOP);の後にHandle_bgmが切り替わった時にPlaySoundMemが必要です。

c++

1void Sound_Update() { 2 int next_bgm = Handle_bgm; 3 switch (nowpanel) { 4 case STATE_TITLE: 5 if (titleroop == true) { 6 next_bgm = Handle_bgm_a; 7 } 8 break; 9 case STATE_GAME: 10 if (gameroop == true) { 11 next_bgm = Handle_bgm_b; 12 } 13 break; 14 case STATE_RESULT: 15 if (resultroop == true) { 16 next_bgm = Handle_bgm_c; 17 } 18 break; 19 case STATE_CREDIT: 20 if (creditroop == true) { 21 next_bgm = Handle_bgm_d; 22 } 23 break; 24 } 25 if(Handle_bgm != next_bgm) { 26 StopSoundMem(Handle_bgm); 27 Handle_bgm = next_bgm; 28 PlaySoundMem(Handle_bgm, DX_PLAYTYPE_LOOP); 29 } 30}

投稿2021/06/15 09:21

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fkcz_yfm_carp

2021/06/16 07:28

返信ありがとうございます。 回答の通り書き直したところBGMを切り替えることができるようになりました。 StopSoundMemの使い方がずっと分からなかったのですがこのように使うことができるのですね! Next_bgmを作って切り替える手法も勉強になりました、丁寧な回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問