BGMが正常に再生できません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kerotan0820
記事: 91
登録日時: 14年前

BGMが正常に再生できません

#1

投稿記事 by kerotan0820 » 14年前

やっと、初のゲーム製作の乗り出しました。
C言語でWindowアプリを作ったことがあるのかと言われればないし、ただ if、for,while,その他C言語におけるメモリ操作の基礎など、簡単な教本を理解し、目を通しただけで、
プログラムを組むとなると、全体の構成を考える必要性の重要さに気づき、それでもなかなかうまくまとまらずに困っています><。

汚くて質問するのも抵抗があるくらいなプログラムなのですが、今のところこのようになっています。

コード:

#include "DxLib.h"
 
int menu=0,playmusic=1,Start1,Key[256],White;
int back1/*menu*/,back2/*play1*/;
int Sound1/*menu*/,Sound2/*play1*/;

void Start(){
	if(playmusic==0){
		StopMusic();
		playmusic=2;
	}

	if(playmusic==2)
	PlaySoundMem( Sound2 , DX_PLAYTYPE_BACK );//バックグラウンド再生
	
	DrawGraph( 0 , 0 , back1  , FALSE ) ;
}
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	/*******A色定義********/
	White = GetColor( 255 , 255 , 255 ) ; 

	/*******画像のメモリ読み込み*******/
	back1 = LoadGraph( "image/back(play).png" ) ;
	back2 = LoadGraph( "image/back(menu).png" ) ;

	/*******音声のメモリ読み込み*******/
	Sound1 = LoadSoundMem( "Sound/backmusic/menu(music).wav" );
	Sound2 = LoadSoundMem( "Sound/backmusic/play(music).wav" );

 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない

		if(menu==0){
			if(playmusic == 1){
				PlaySoundMem( Sound1 , DX_PLAYTYPE_BACK );//バックグラウンド再生
			}

			DrawGraph( 0 , 0 , back2  , FALSE ) ;
		    DrawString(100,100,"Xキーでゲームスタート\n",White);
			playmusic=0;
		}
		
		if(Key[KEY_INPUT_X]==1 || menu==1){
				Start();
			    menu=1;
		}
 
        ScreenFlip();
	}
 
    DxLib_End();
    return 0;
}

While文で全体をひたすらループし、したい動作に合わてif文の真、疑を変動させてプログラムを動作させよう、という試みです。

メインプログラムでは、基本的にメニュー画面の処理のみをし、それ以外の描画はすべて関数を使います。
(ゲームの1面! 2面! そういったものをどのように処理すればいいのか、ゲームプログラミングの館には記述がなかったので、気がついたら関数内で処理するしかなくなってました。
どうしても改善すべきだ・・・ 先々困る!といったことがあるようでしたら、ご指摘くださると幸いです。 複雑になる前階で修正したいと思います)

本題なのですが、Xキーを押すとMenu画面を抜け、ゲームプレイ画面に行くのですが、メニュー画面、ゲームプレイ画面でそれぞれBGMを分けています。
それぞれ画面が移動すれば曲が切り替わるようにしたいのですが、メニュー画面を抜け、ゲームプレイ画面へ移動してもメニュー画面での曲が流れてしまいます。
ゲームプレイ画面の曲も同時に流れるのか、といいますと流れることもありません。
ただし、画面をクリックしている際とアクティブでない状態になると何故か流れます…。

if文で ~ の時は流し ~の時は流さない、~の時は曲をとめて BGM2を再生…  
こういった分岐による流す流さないをいろいろ考えたのですが、二日かけてどうしても解決しなかったので質問させていただきました。

長文になって大変申し訳ないのですが、ご教示いただけると幸いです。
けろけろにゃー (」・ω・)」うー!

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: BGMが正常に再生できません

#2

投稿記事 by h2so5 » 14年前

DXライブラリのリファレンスで、
StopMusic関数の説明をよく確認して下さい。

さらに、
PlaySoundMem( Sound2 , DX_PLAYTYPE_BACK );
が毎フレーム実行されています。

kerotan0820
記事: 91
登録日時: 14年前

Re: BGMが正常に再生できません

#3

投稿記事 by kerotan0820 » 14年前

>>h2so5さん
調べてみたところ、StopMusicはPlayMusicに対するもので、StopSoundはStopSoundに対するものとのことでした。
無事音声が止まりました。
それと、一応利便性を考えてStopSoundMem( Sound1 ) ; を使うことにしました

>>PlaySoundMem( Sound2 , DX_PLAYTYPE_BACK );が毎フレーム実行されている
修正したところ、無事解決しました^^
ありがとうございました。
けろけろにゃー (」・ω・)」うー!

閉鎖

“C言語何でも質問掲示板” へ戻る