通常、私は次のようなことをします:
/// play_sound(sound, [loop])
var vol = global.volume_sfx; // global.volume_sfx must contain volume (0...1)
if vol == 0 exit; // if volume is 0 then not need play, exit
var snd = argument[0]; // name of sound which need play, passed to the script
var loop = false; // need loop sound or not
if argument_count > 1 loop = argument[1];
var s = audio_play_sound(snd, 50, loop); // Start sound
audio_sound_gain(s, vol, 0); // Set volume for this sound
使用法:
play_sound(snd_click, false);
すべての音を止める必要があるときは、次のようにします。
audio_stop_all();
upd:play_sound
最初のコード
を含む名前で新しいスクリプトを作成します。次に、サウンドを再生する必要があるときに呼び出します。このコードは、設定 ( var vol = global.volume_sfx
) から音量を取得し、この音量ですべてのサウンドを再生します。
変数global.volume_sfx
には、0 (音なし) から 1 (最大音量) までの値を含める必要があります。したがって、サウンドを有効/無効にするには、この変数を 0 から 1 または 1 から 0 (のようにglobal.volume_sfx = !global.volume_sfx
) に変更する必要があります。または、サウンド設定にスライダーがある場合は、任意の音量を設定できます (たとえば、最大音量の 50% の場合は 0.5)。
スライダーとボタンを使用した小さな例を参照してください。sound on/off
アップ2:
申し訳ありませんが、私はまだあなたのコードを理解していません. 各行のスクリプトと obj_sound_enable について説明していただけますか?
私の英語は下手ですが、がんばります...
良い。ユーザーが音量を調整できるメニューがあるとします。ゲームでサウンドを再生する場合は、この設定を考慮する必要があります。これは、さまざまな方法で行うことができます。
たとえば、異なるオーディオ グループを作成できます。1 つは音楽用、もう 1 つはエフェクト用で、ボリュームをグループ全体に設定します。この場合、すべてのサウンドがメモリに保存され、常にアクセスできるとは限りません (オーディオ グループはストリーム再生には機能しません)。
その他の方法 - ボリュームのグローバル レベルを変更します。単純ですが、音楽とエフェクトを別々に設定する必要がある場合は近づきません。
別の方法 (私が提案した方法) - サウンドの再生に使用される独自の関数を作成します。この関数には、再生するサウンドの名前と、サウンドをループするかどうかのオプションを渡す必要があります。機能は、ボリュームの設定をチェックし、それに応じてサウンドを再生します。
/// play_sound(sound, [loop])
この行は、コード エディターに表示されるヒントを定義します。角括弧は通常、スキップできるパラメーターを示します。つまり、関数は 1 つまたは 2 つのパラメーターで呼び出すことができます。
play_sound(snd_wind, true); // play sound snd_wind with loop
play_sound(snd_explode); // play sound snd_explode (no loop)
次の行。
var vol = global.volume_sfx; // global.volume_sfx must contain volume (0...1)
global.volume_sfx
ボリュームを含むグローバル変数です。ゲームの設定でユーザーが設定します。これは、0 (無音) から 1 (最大音量) までの値である必要があります。
vol
一時ストレージのボリューム設定に使用される変数です。もちろん、global.volume_sfx
新しい変数を作成する代わりに使用することもできますが、私はいくつかの理由でローカル変数を好みます。まず、ローカル変数はグローバル変数よりも少し速く動作します。第二global.volume_sfx
に、別のものに変更する必要がある場合は、1 か所だけ変更する必要があります。これにより、エラー/タイプミス/その他の可能性が減少します。
キーワードは、これがローカル変数であることを示しており、var
この変数はスクリプトの終了後に破棄されます。
if (vol == 0) exit; // if volume is 0 then not need play, exit
vol
変数にはすでに音量レベルが含まれており、ここでこの値がチェックされます。音量レベルがゼロの場合 ( if vol == 0
)、サウンドを再生する必要はなく、スクリプトは終了します ( exit
)。
var snd = argument[0]; // name of sound which need to be played, passed to the script
ここで、ローカル変数snd
が作成されます。これには、スクリプトに渡された最初のパラメーターが含まれます (番号はゼロから始まります)。このパラメーターには、再生したいサウンドの名前が含まれています。
var loop = false; // need loop sound or not
loop
変数が表示され、サウンドがループされているかどうかが示されます。デフォルト値は ですfalse
。つまり、サウンドはループしません。
if (argument_count > 1) loop = argument[1];
スクリプトに渡された引数の数をチェックします。複数 ( argument_count > 1
) の場合、loop
変数には 2 番目の引数の値が割り当てられます ( loop = argument[1]
)
var s = audio_play_sound(snd, 50, loop); // Start sound
優先度 50 でサウンドを再生します。変数s
にはこの操作の結果が含まれ、後でこのサウンド (正確にはこれであり、他のサウンドではありません) を制御するために使用できる特別な ID になります。次の行は、右の音量を設定するためにそれを使用します。
audio_sound_gain(s, vol, 0); // Set volume for this sound
この関数は、指定されたサウンドを必要な音量に設定します。
関数の詳細な説明については、GMS のドキュメントを参照してください。
最も単純な場合、このスクリプトは次のようになります。
/// play_sound(sound, is_loop)
if (global.volume_sfx == 0) exit;
var s = audio_play_sound(argument0, 50, loop);
audio_sound_gain(s, global.volume_sfx, argument1);
今すぐオブジェクトobj_sound_enable
。完全なコードは次のとおりです。
global.volume = !round(global.volume);
if !global.volume
{
audio_stop_all();
}
記号の!
意味not
。
if !aaa
等しい
if (aaa == false)
と
if aaa
等しい
if (aaa == true)
GMStrue
では、等しい1
とfalse
等しい0
(実際には、その値だけでなく、この場合は問題ではありません)。だから私がするとき
if !global.volume
等しい
if (global.volume == false)
そしてそれは意味します
if (global.volume == 0)
つまり、ボリュームが 0 の場合、すべてのサウンドを停止します。
最初の行は同様に機能します
global.volume = !round(global.volume);
声明
a = !a
は、「a
がの場合true
、新しい値は になりfalse
、a
がの場合false
、新しい値はtrue
」になることを意味します。
a = false;
b = !a; // now "b" is "true" ("1");
c = 1;
d = !c; // now "d" is "0" ("false")
したがって、これは単純なスイッチャー0
です1
。
ただし、ボリュームは整数ではなく実数なので、「切り替える」前に丸めます。サウンドオン/サウンドオフボタンのみが必要な場合は、ラウンドは必要なく、シンプルに使用できますglobal.volume = !global.volume