2

すべての sfx をオン/オフする設定を持つゲームを作成しています。私はこれらのsfxを持っています: snd_hover, snd_click, and snd_back. これらの sfx は、ホーム画面から自動的に再生されます。私はこれらの機能を試しました:

audio_exists
audio_stop_all

しかし、すべての sfx はまだ再生されています。私は作ろうとしました:

a variable which turn into 0 when btn_Off is clicked,
and turn into 1 when btn_On is clicked

しかし、すべての sfx はまだ再生されています。私は何をすべきか?可能であれば、ドラッグイベントの回答をお願いします。

4

1 に答える 1

1

通常、私は次のようなことをします:

/// 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では、等しい1false等しい0(実際には、その値だけでなく、この場合は問題ではありません)。だから私がするとき

if !global.volume

等しい

if (global.volume == false)

そしてそれは意味します

if (global.volume == 0)

つまり、ボリュームが 0 の場合、すべてのサウンドを停止します。

最初の行は同様に機能します

global.volume = !round(global.volume);

声明

a = !a

は、「aがの場合true、新しい値は になりfalseaがの場合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

于 2016-05-08T12:15:14.970 に答える