Game Maker Включение / выключение звуковых эффектов
Я делаю игру, в которой есть настройка для включения / выключения всех 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 ответ
Обычно я делаю что-то вроде этого:
/// 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
кнопка.
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
будет содержать результат этой операции, и это будет специальный идентификатор, который можно использовать позже для управления этим (именно этим, и никаким другим) звуком. Следующая строка будет использовать его для правильной настройки громкости.
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)
В ГМС true
равно 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