Game Maker Turn On/Off 音效
Game Maker Turn On/Off Sound Effects
我正在制作一个游戏,其中设置了 on/off 所有 sfx。我有这些 sfx:snd_hover, snd_click, and snd_back
。这些 sfx 会自动从主屏幕播放。我试过这些功能:
audio_exists
audio_stop_all
但所有音效仍在播放。我试过:
a variable which turn into 0 when btn_Off is clicked,
and turn into 1 when btn_On is clicked
但所有音效仍在播放。我应该怎么办?如果可能请给出拖动事件的答案。
通常我会这样做:
/// 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();
更新:
使用第一个代码创建名称为 play_sound
的新脚本。然后在需要播放任何声音时调用它。此代码从设置 (var vol = global.volume_sfx
) 获取音量并使用此音量播放所有声音。
变量global.volume_sfx
必须包含从 0(无声音)到 1(最大音量)的值。因此,对于 enable/disable 声音,您需要将此变量从 0 更改为 1 或从 1 更改为 0(如 global.volume_sfx = !global.volume_sfx
)。或者,如果您在声音首选项中有滑块,那么您可以设置任何音量(例如,0.5 表示最大音量的 50%)。
查看带有滑块和 sound on/off
按钮的小 example。
upd2:
Sorry, but I still don't understand your code. Can you explain the script and obj_sound_enable for each row?
我的英语不好,但我会努力...
嗯。假设有一个菜单,用户可以在其中调节音量。游戏中的任何声音播放都应考虑此设置。这可以通过多种方式完成。
例如,可以创建不同的音频组 - 一个用于音乐,一个用于效果并将音量设置为整个组。在这种情况下,所有声音都将存储在并非总是接近的内存中(音频组不适用于流播放)。
其他方法 - 更改全局音量级别。简单,但如果需要对音乐和效果进行单独设置,则不做处理。
另一种方法(我建议的)- 创建您自己的函数来播放声音。对于函数,必须传递要播放的声音的名称和声音是否循环播放的选项。函数检查音量设置并根据它们播放声音。
/// play_sound(sound, [loop])
这一行定义了将在代码编辑器中显示的提示。
方括号通常表示可以跳过的参数。 IE。该函数可以用一个或两个参数调用:
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
是一个全局变量,里面包含了volume。它由用户在游戏设置中设置。这应该是一个从 0(无声音)到 1(最大音量)的值。
vol
是一个变量,将用于临时存储卷设置。当然,我们可以使用 global.volume_sfx
代替,而不是创建一个新变量,但出于某些原因我更喜欢局部变量。首先 - 局部变量比全局变量工作得快一点。其次 - 如果您需要将 global.volume_sfx
更改为其他内容,您只需在一个地方进行更改 - 这会降低 errors/typos/etc.
的可能性
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
等于 1
并且 false
等于 0
(实际上,不仅是那个值,而且在这种情况下并不重要) .所以当我这样做时
if !global.volume
等于
if (global.volume == false)
这意味着
if (global.volume == 0)
即如果音量为 0 则停止所有声音。
第一行类似
global.volume = !round(global.volume);
声明
a = !a
表示"if a
is true
then the new value will be false
, and if a
is false
then the new value will be true
".
a = false;
b = !a; // now "b" is "true" ("1");
c = 1;
d = !c; // now "d" is "0" ("false")
所以这是一个从 0
到 1
再返回的简单切换器。
但是体积是实数,不是整数,所以我在"switching"前四舍五入。如果你只需要声音 on/sound 关闭按钮那么你不需要圆形并且可以使用简单的 global.volume = !global.volume
我正在制作一个游戏,其中设置了 on/off 所有 sfx。我有这些 sfx:snd_hover, snd_click, and snd_back
。这些 sfx 会自动从主屏幕播放。我试过这些功能:
audio_exists
audio_stop_all
但所有音效仍在播放。我试过:
a variable which turn into 0 when btn_Off is clicked,
and turn into 1 when btn_On is clicked
但所有音效仍在播放。我应该怎么办?如果可能请给出拖动事件的答案。
通常我会这样做:
/// 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();
更新:
使用第一个代码创建名称为 play_sound
的新脚本。然后在需要播放任何声音时调用它。此代码从设置 (var vol = global.volume_sfx
) 获取音量并使用此音量播放所有声音。
变量global.volume_sfx
必须包含从 0(无声音)到 1(最大音量)的值。因此,对于 enable/disable 声音,您需要将此变量从 0 更改为 1 或从 1 更改为 0(如 global.volume_sfx = !global.volume_sfx
)。或者,如果您在声音首选项中有滑块,那么您可以设置任何音量(例如,0.5 表示最大音量的 50%)。
查看带有滑块和 sound on/off
按钮的小 example。
upd2:
Sorry, but I still don't understand your code. Can you explain the script and obj_sound_enable for each row?
我的英语不好,但我会努力...
嗯。假设有一个菜单,用户可以在其中调节音量。游戏中的任何声音播放都应考虑此设置。这可以通过多种方式完成。
例如,可以创建不同的音频组 - 一个用于音乐,一个用于效果并将音量设置为整个组。在这种情况下,所有声音都将存储在并非总是接近的内存中(音频组不适用于流播放)。
其他方法 - 更改全局音量级别。简单,但如果需要对音乐和效果进行单独设置,则不做处理。
另一种方法(我建议的)- 创建您自己的函数来播放声音。对于函数,必须传递要播放的声音的名称和声音是否循环播放的选项。函数检查音量设置并根据它们播放声音。
/// play_sound(sound, [loop])
这一行定义了将在代码编辑器中显示的提示。 方括号通常表示可以跳过的参数。 IE。该函数可以用一个或两个参数调用:
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
是一个全局变量,里面包含了volume。它由用户在游戏设置中设置。这应该是一个从 0(无声音)到 1(最大音量)的值。
vol
是一个变量,将用于临时存储卷设置。当然,我们可以使用 global.volume_sfx
代替,而不是创建一个新变量,但出于某些原因我更喜欢局部变量。首先 - 局部变量比全局变量工作得快一点。其次 - 如果您需要将 global.volume_sfx
更改为其他内容,您只需在一个地方进行更改 - 这会降低 errors/typos/etc.
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
等于 1
并且 false
等于 0
(实际上,不仅是那个值,而且在这种情况下并不重要) .所以当我这样做时
if !global.volume
等于
if (global.volume == false)
这意味着
if (global.volume == 0)
即如果音量为 0 则停止所有声音。
第一行类似
global.volume = !round(global.volume);
声明
a = !a
表示"if a
is true
then the new value will be false
, and if a
is false
then the new value will be true
".
a = false;
b = !a; // now "b" is "true" ("1");
c = 1;
d = !c; // now "d" is "0" ("false")
所以这是一个从 0
到 1
再返回的简单切换器。
但是体积是实数,不是整数,所以我在"switching"前四舍五入。如果你只需要声音 on/sound 关闭按钮那么你不需要圆形并且可以使用简单的 global.volume = !global.volume