GM Squall

Стандартная звуковая система GameMaker имеет множество недостатков: невозможность управлять отдельными каналами, странная функция проверки на проигрывание звука (она редко работает), отсутствие возможности изменять частоту звука и т.д.
На помощь приходят различные dll. Вот в этой статье мы как раз и поговорим о такой dll, как GM Squall.

Эта библиотека создана мной на бесплатном звуковом движке Шквал с использованием управляющих структур, написанных так же мной. У этого движка поистине уникальные возможности с учетом того, что он - бесплатный: проигрывание всех популярных форматов музыки, включая трековые (mod, xm и т.д.); поддержка всех мыслимых звуковых эффектов (EAX1/2/3); множество различных настроек как сэмплов, так и каналов.

К сожалению, GM Squall поддерживает не все его возможности, но обладает рядом дополнений и расширений (благодаря управляющим структурам). Одно из них – менеджеры. Благодаря этой замечательной вещи вы можете управлять каналами в отдельности для каждого сэмпла. Т.е. сэмпл один (один раз загружается в память), а менеджеров много и они используют этот сэмпл, вернее, его каналы. А GameMaker использует один сэмпл, и, отсюда, когда вы изменяете настройки звука, они меняются и у всех каналов. Это, конечно же, нам не подходит. Так же разработана система для удобного хранения всех загруженных сэмплов. Они распределяются по группам, вы можете выгрузить любую группу в любой момент, или приостановить проигрывание. Очень удобно.

В GM Squall сэмплы разделены на три группы: 2D звуки – невозможность позиционирования и установки некоторых свойств. Применяются для озвучивания интерфейса; 3D звуки – возможность позиционирования; музыка – эти файлы не загружаются в памяти и служат как фоновая музыка.

Важно понимать, что использование такой мощной системы не всегда уместно. Например, в обычной аркаде, в которой играет пара звуков да музыкальный фон, можно использовать стандартные возможности GM, а вот если нужно встроить в игру возможность позиционирования звуков (когда нам важно, чтобы звук менял свои параметры в зависимости от текущей позиции и позиции слушателя (игрока)), то эта система незаменима. В этом в основном нуждаются action и horror.
Функции

Далее идет описание всех доступных функций.

    ss_init() – инициализация системы. Этот скрипт должен быть обязательно вызван в начале игры до использования каких либо последующих скриптов.

    ss_free() – освобождение системы. Этот скрипт должен быть обязательно вызван в конце игры.

    ss_add_sound(path, type, group) – добавляет новый сэмпл из path типа type (0 – 2D, 1 – 3D, 2 – музыка) с группой group. Возвращает индекс загруженного сэмпла.

    ss_add_manager() – добавляет новый менеджер. Возвращает его индекс.

    ss_play(idx, loop) – проиграть сэмпл с индексом idx. Параметр loop указывает на зацикленность проигрывания (0 – нет, 1 – да). Этот скрипт используется только для сэмплов типа 2D и музыка.

    ss_play_ex(idx, type, x, y, z, loop) – проиграть сэмпл или менеджер с индексом idx (что проигрывать указывает параметр type: 0 – сэмпл, 1 – менеджер) с позицией в (x, y, z). Параметр loop указывает на зацикленность проигрывания (0 – нет, 1 – да). Позиционирование действует только для сэмплов типа 3D.

    ss_set_listiner_position(x, y, z) – устанавливает позицию слушателя (игрока).

    ss_get_samples_count() – возвращает количество загруженных сэмплов.

    ss_pause() – переключение приостановки проигрывания всех каналов. Если во время паузы проиграть какой либо канал, то пауза снимается.

    ss_pause_group(group, pause) – переключение проигрывания группы group. pause указывает на остановку (0 – возобновить проигрывание, 1 – остановить).

    ss_stop() – полная остановка проигрывания.

    ss_stop_group(group) – полная остановка проигрывания группы group.

    ss_unload_group(group) – выгрузка определенной группы сэмплов из памяти.

    ss_find_by_filename(fname) – поиск сэмпла в загруженных по имени файла. Возвращает индекс найденного сэмпла. Если не найдет, то возвращает -1.
    Сэмплы

    ss_sample_unload(idx) – выгрузка сэмпла с индексом idx из памяти.

    ss_sample_set_volume(idx, vol) – установка громкости (0..100) для сэмпла с индексом idx в vol.

    ss_sample_set_frequency(idx, freq) - установка частоты для сэмпла с индексом idx в freq.

    ss_sample_set_properties(idx, mindist, maxdist) – установка параметров сэмпла с индексом idx. mindist – расстояние, в пределах которого звук будет слышен с максимальной громкостью. maxdist – при расстоянии от слушаетля до источника проигрывания больше данного значения, громкость будет равнятся нулю.

    ss_sample_get_isplaying(idx) – возвращает значение 1, если есть открытые каналы у сэмпла с индексом idx. 0 в противном случае.

    ss_sample_get_file_frequency(idx) – возвращает исходную частоту сэмпла с индексом idx.

    ss_sample_stop(idx) – полная остановка проигрывание сэмпла с индексом idx.
    Менеджеры

    ss_man_set_sample(idx, sidx) – установка сэмпла с индексом sidx для менеджера с индексом idx.

    ss_man_get_sample(idx) – возвращает индекс сэмпла менеджера с индексом idx.

    ss_man_set_position(idx, x, y, z) – устанавливает источник звука для менеджера с индексом idx в позицию (x, y, z).

    ss_man_set_volume(idx, vol) – установка громкости vol (0..100) для менеджера с индексом idx.

    ss_man_set_frequency(idx, freq) – установка частоты freq для менеджера с индексом idx.

    ss_man_set_properties(idx, maxchannels, mindist, maxdist) – установка настроек менеджера с индексом idx. maxchannels – максимальное количество действующих каналов; mindist и maxdist см. ss_sample_set_properties.

    ss_man_get_isplaying(idx) – возвращает 1, если есть действующие каналы у менеджера с индексом idx. 0 в противном случае.

    ss_man_get_channels_count(idx) – возвращает количество действующих каналов у менеджера с индексом idx.

    ss_man_stop(idx) – полная остановка проигрывания каналов у менеджера с индексом idx.

    ss_man_free(idx) – удаление из памяти менеджера с индексом idx. Нужно обязательно вызывать, если менеджер не будет больше использоваться.

Менеджеры стоит использовать в том случае, если возможно несколько экземпляров объекта. Т.е., например, NPC. У них есть звуки шагов. Для каждого NPC позиция разная. Поэтому вам нужно создать для каждого NPC свой менеджер, которому присвоить нужный сэмпл. Далее уже работать с ним. В примере в архиве с GM Squall показано, как это делать. Если также вы больше не будете использовать менеджер (например, после уничтожения экземпляра объекта), то обязательно удаляйте его из памяти.

Если вы используете позиционирование, то не забывайте выставлять позицию слушателя. Это обычно делается в событии шага игрока. Изменение позиционирования работает только для менеджеров с сэмплом типа 3D. Изменение позиции сэмпла невозможно во время проигрывания – это можно сделать только в вызове самого скрипта (ss_play_ex).

Самая последняя версия GM Squall доступна по этому адресу: http://freefly.mirgames.ru/?gamemaker/index.html#gms
Версия предназначена для GameMaker 7.

Если возникли какие-либо вопросы, пишите мне на e-mail, либо на форуме: http://freefly.mirgames.ru/forums/viewtopic.php?id=39

Chaser (Freefly Studios)
http://freefly.mirgames.ru
chaser@mirgames.ru

