created: 2025/12/5

💬 GameMaker Advent Calendar 2025 に参加しています。

BGMを毎回最初から再生すると後半まで鳴らない……

メインのBGMが鳴っている状態でイベントのBGMに割り込まれ、またメインBGMに戻った時、いつも最初から再生されるとなかなか後半までいかない、いつも前半ばかり聞かされるということが起こり得ます。さっきまで鳴ってたところから再開してほしいことがあります。

ポーズとレジュームで解決できる

そんなときは audio_pause_sound と audio_resume_sound を使う方法があります。

実装の概略

今回は次のような仕様で作ります。

実装例

これはaudio_pause_soundaudio_resume_soundの使用サンプルです。

今回はBGMを鳴らすオブジェクト o_bgm を作って全部これに実装します。

以下のコードはCreateイベントです。

/****************************
o_bgm : Create event
****************************/
main_bgm_instance = noone;
sub_bgm_instance = noone;

/// @desc メインBGMを開始する
/// @func play_main_bgm();
/// @param {Asset.GMSound} sound
play_main_bgm = function(sound)
{
	// サブBGMを止める
	audio_stop_sound(sub_bgm_instance);
	sub_bgm_instance = noone;
	
	if (audio_is_paused(main_bgm_instance))
	{
		// メインBGMをレジューム再生
		audio_resume_sound(main_bgm_instance);
		return main_bgm_instance;
	}
	else
	{
		// メインBGMを頭から再生
		var instance = audio_play_sound(sound, 1, true);
		return instance;
	}
}

/// @desc サブBGMを再生する
/// @func play_sub_bgm();
/// @param {Asset.GMSound} sound
play_sub_bgm = function(sound)
{
	// メインBGMをポーズ
	audio_pause_sound(main_bgm_instance);
	
	// サブBGMを頭から再生
	return audio_play_sound(sound, 1, true);
}