2016-05-07 5 views
2

Я делаю игру, в которой есть настройка для включения/выключения всех sfx. У меня есть sfx: snd_hover, snd_click, and snd_back. Эти sfx автоматически воспроизводятся с главного экрана. Я пробовал эти функции:Game Maker Включение/выключение Звуковые эффекты

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 все еще играют. Что мне делать? Если возможно, дайте ответные сообщения с помощью drag-event.

ответ

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 с 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

+0

вы можете объяснить свой код? –

+0

Я обновил ответ и добавил пример. – Dmi7ry

+0

Извините, но я до сих пор не понимаю ваш код. Можете ли вы объяснить сценарий и obj_sound_enable для каждой строки? –

Смежные вопросы