Обычно я делаю что-то вроде этого:
/// 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
с fi первый код. Затем назовите его, когда вам нужно воспроизвести любой звук. Этот код получает громкость от настроек (var vol = global.volume_sfx
) и воспроизводит все звуки с этим томом.
Переменная global.volume_sfx
должна содержать значение от 0 (без звука) до 1 (полный объем). Итак, для включения/выключения звуков вам нужно изменить эту переменную от 0 до 1 или от 1 до 0 (например, global.volume_sfx = !global.volume_sfx
). Или, если у вас есть слайдер в настройках звука, вы можете установить любой том (например, 0,5 для 50% максимального объема).
См. Небольшие example с ползунком и 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
на что-то еще, вам нужно будет изменить его только в одном месте - это уменьшит вероятность ошибок/опечаток/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
равна е qual 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
вы можете объяснить свой код? –
Я обновил ответ и добавил пример. – Dmi7ry
Извините, но я до сих пор не понимаю ваш код. Можете ли вы объяснить сценарий и obj_sound_enable для каждой строки? –