Game Maker打开/关闭声音效果

时间:2016-05-07 11:24:19

标签: game-maker soundeffect

我制作了一款游戏,其中包含打开/关闭所有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仍然在玩。我该怎么办?如果可能,请给出拖拽事件答案。

1 个答案:

答案 0 :(得分: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)。或者,如果您在声音首选项中有滑块,则可以设置任何音量(例如,0.5表示最大音量的50%)。

使用滑块和sound on/off按钮查看小example

<强> UPD2:

  

抱歉,我仍然不理解你的代码。你能解释每一行的脚本和obj_sound_enable吗?

我的英语不好,但我会尝试......

好。让我们想象一下,用户可以调整音量。在游戏中播放任何声音都应考虑此设置。这可以通过多种方式完成。

例如,可以创建不同的音频组 - 一个用于音乐,一个用于效果,并将音量设置为整个组。在这种情况下,所有声音都将存储在内存中并不总是接近(音频组不适用于流播放)。

其他方法 - 更改全局卷级别。简单地说,如果有必要对音乐和效果进行单独设置,则不会接近。

另一种方式(我已经建议) - 创建自己的功能,用于播放声音。对于该功能,必须传递您要播放的声音的名称以及声音是否循环的选项。功能检查音量设置并根据它们播放声音。

/// play_sound(sound, [loop])

此行定义将在代码编辑器中显示的提示。 方括号通常表示可以跳过的参数。即可以使用一个或两个参数调用该函数:

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更改为其他内容,则只需在一个位置更改它 - 这样可以减少错误/拼写错误等的可能性。

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变量将被赋予第二个参数的值(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)

在GMS中true相等1false等于0(实际上,不仅是这些值,但在这种情况下它并不重要) 。所以当我做的时候

if !global.volume

等于

if (global.volume == false)

,这意味着

if (global.volume == 0)

即。如果音量为0则停止所有声音。

第一行的作品类似

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

声明

a = !a

表示&#34;如果atrue,则新值为false,如果afalse则新值将为是true&#34;。

a = false;
b = !a; // now "b" is "true" ("1");
c = 1;
d = !c; // now "d" is "0" ("false")

因此,这是一个简单的切换器,从01并返回。

但是音量是实数,而不是整数,所以我在&#34;切换&#34;之前将其舍入。如果您只需要声音开启/声音关闭按钮,那么您不需要回合并且可以使用简单的global.volume = !global.volume