BGMを指定した場面で鳴らしたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あれっくす

BGMを指定した場面で鳴らしたい

#1

投稿記事 by あれっくす » 13年前

今、初心者ですがゲームを作ってます。

コード:

#include "DxLib.h"

int Key[256];	// キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256];	// 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey );	// 全てのキーの入力状態を得る
	for( int i=0; i<256; i++ ){
		if( tmpKey[i] != 0 ){	// i番のキーコードに対応するキーが押されていたら
			Key[i]++;	// 加算
		} else {	 // 押されていなければ
			Key[i] = 0;	// 0にする
		}
	}
	return 0;
}

// 画面状態の定数
enum {
	STATE_TITLE,	// タイトル画面
	STATE_MAIN,		// メイン画面
	STATE_END,		// ゲーム終了
};

//-------------------------------------------------
// タイトル
//-------------------------------------------------

int title()
{
	DrawFormatString( 190, 250, GetColor(255,255,255), "Please Push Enter");
	
	if( Key[ KEY_INPUT_RETURN ]==1 ) return TRUE;	// Enterが押されたらTRUE
	return FALSE;	// Enterが押されなければFALSE
}

//-------------------------------------------------
// ゲームメイン
//-------------------------------------------------

// ゲームメイン
int gmain()
{

	DrawFormatString( 190, 250, GetColor(255,255,255), "ゲームメイン");

	if( Key[ KEY_INPUT_RETURN ] == 1 ) return TRUE;	// ENTERが押されたらTRUE
	return FALSE;	// ENTERが押されなければFALSE
}

//-------------------------------------------------
// メインループ
//-------------------------------------------------

int WINAPI WinMain( HINSTANCE, HINSTANCE,LPSTR, int ){
	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );	// ウィンドウモード変更と初期化と裏画面設定

	// 現在の状態
	int state = STATE_TITLE;

	// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新 )
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 && ( state!=STATE_END ) ){

		switch( state ){
		case STATE_TITLE:	// タイトル画面
			// タイトル
			if( title() ){
				// なにか押されたら選択画面へ
				state = STATE_MAIN;
			}
			break;

		case STATE_MAIN:	// メイン画面
			// ゲームメイン
			if( gmain() ){
				// 終了したらタイトルへ
				state = STATE_TITLE;
			}
			break;
		}
	}
	DxLib_End();	// DXライブラリ終了処理
	return 0;
}
これはプログラムの一部ですが、
ゲームメインが実行されたらBGMを流し、
ゲームからタイトルに戻ったらBGMを停止し、
再びゲームメインが実行されたらBGMを初めから再生するといったようなプログラムにしたいです。

PlayMusicやPlaySoundFileなどの関数を使ってやってみたのですが、
タイトルの時点で鳴ってしまったりして悩んでいます。
どのように書いたらいいでしょうか?

アバター
ぱにしん
記事: 58
登録日時: 14年前
住所: 滋賀

Re: BGMを指定した場面で鳴らしたい

#2

投稿記事 by ぱにしん » 13年前

あれっくす さんが書きました: PlayMusicやPlaySoundFileなどの関数を使ってやってみたのですが、
タイトルの時点で鳴ってしまったりして悩んでいます。
どのように書いたらいいでしょうか?
貼られているコードのどこにもPlaySoundやPlaySoundFileが書かれていないようですが、どのように書かれたのでしょうか。
とりあえず65行目から81行目を以下のように変更したらゲームメインで音楽が鳴り、Please Push Enterでストップしたのですが・・・

コード:

        switch( state ){
        case STATE_TITLE:   // タイトル画面
            if( title() ){
                // なにか押されたら選択画面へ
                state = STATE_MAIN;
				PlaySoundFile("music.mp3",DX_PLAYTYPE_LOOP);
            }
            break;
 
        case STATE_MAIN:    // メイン画面
            if( gmain() ){
                // 終了したらタイトルへ				
                state = STATE_TITLE;
				StopSoundFile();
            }
            break;
        }

あれっくす

Re: BGMを指定した場面で鳴らしたい

#3

投稿記事 by あれっくす » 13年前

ありがとうございます。
自分の試した方法ではうまくいかなかったので上のプログラムには書いていませんでした。

ぱしにんさんのやり方でやったらちゃんと動作しました。

さらにこれから

コード:

        switch( state ){
        case STATE_TITLE:   // タイトル画面
            // タイトル
            if( title() ){
                // なにか押されたら選択画面へ
                state = STATE_MAIN;
            }
            break;

		case STATE_SELECT:	// 選択画面
			// 選択画面
			state = select();	// 戻りが画面状態
			break;

		case STATE_OPTION:	//オプション画面
			//オプション
			if( option() ){
				//終了したら選択画面へ
				state = STATE_SELECT;
			}
			break;
 
        case STATE_MAIN:    // メイン画面
            // ゲームメイン
            if( gmain() ){
                // 終了したらタイトルへ
                state = STATE_TITLE;
            }
            break;
        }
    }
    DxLib_End();    // DXライブラリ終了処理
    return 0;
}
このようにswitchを増やしていくつもりなのですが、
ゲームメインの時にだけBGMが再生するようにするにはどう書いたらいいでしょうか?

アバター
ぱにしん
記事: 58
登録日時: 14年前
住所: 滋賀

Re: BGMを指定した場面で鳴らしたい

#4

投稿記事 by ぱにしん » 13年前

とりあえずGAMEMAINに移るタイミングでBGMを鳴らしはじめ、GAMEMAINから出るタイミングでBGMを止めるといった風にすればいいのではないでしょうか。
このやり方だと一場面しかないミニゲームで手一杯になりそうですが・・・

閉鎖

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