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

Другие вопросы по тегам