Слоты soundManager: описание

Вопросы создания и совершенствования звуковой подсистемы игры
Ответить
Аватара пользователя
dimka
Сообщения: 2
Зарегистрирован: 01 сен 2019, 06:15
Город: Днепропетровск
Настоящее имя: Дмитрий
Контактная информация:

Слоты soundManager: описание

Сообщение dimka » 15 мар 2020, 18:51

В данной серии гайдов будут описываться особенности модуля soundManager симулятора RRS, который содержит в себе необходимые инструменты для работы со звуками. В частности будут разбираться его публичные слоты, так как именно с ними необходимо оперировать при работе со звуками в любом другом модуле.

1. Описание сигналов модуля soundManager для работы со звуком

Для работы со звуком в RRS используются элементарные подпрограммы которые объявлены в модуле "soundManager" и являются слотами:

Код: Выделить всё

slots:

    // Воспроизвести звук
    void soundPlay(QString name);

    // Стоп воспроизведения звука
    void soundStop(QString name);

    // Задать громкость
    void soundSetVolume(QString name, int volume);

    // Задать тональность
    void soundSetPitch(QString name, float pitch); 
Далее в классах которые предполагают работу со звуком, подключается soundManager.h и объявляются сигналы:

Код: Выделить всё

signals:

    // Воспроизвести звук
    void soundPlay(QString name);

    // Стоп воспроизведения звука
    void soundStop(QString name);

    // Задать громкость
    void soundSetVolume(QString name, int volume);

    // Задать тональность
    void soundSetPitch(QString name, float pitch);
Передаваемые параметры:
  • name - имя звукового сэмпла из файла "sounds.xml"
  • volume - значение громкости (0 - 100) типа данных Int32
  • pitch - значение тональности (по умолчанию 1.0) тип данных float
Однако следует отметить что если унаследовать класс со слотами вовсе не обязательно снова подключать soundManager.h и объявлять сигналы. Достаточно просто присоединить сигналы класса-родителя к дочернему классу.

Например пускай класс MyClass имеет свой экземпляр class1 наследует класс ParentClass с сигналами работы со звуком. Тогда в дочернем классе Class1 мы должны вызвать один раз процедуру инициализации и соединить сигналы класса родителя с экземпляром дочернего класса.

Код: Выделить всё

void MyClass::Init()
{
    connect(&class1, &MyClass::soundPlay, this, &ParentClass::soundPlay);
    connect(&class1, &MyClass::soundStop, this, &ParentClass::soundStop);
    connect(&class1, &MyClass::soundSetVolume, this, &ParentClass::soundSetVolume);
    connect(&class1, &MyClass::soundSetPitch, this, &ParentClass::soundSetPitch);
}
P.S. Если хотите более подробно изучить слоты и сигналы в Qt, то могу порекомендовать ознакомится с ними, например в статье на хабрахабре: https://habr.com/ru/post/50812/

Далее мы можем пользоваться данными подпрограммами вызывая их в любой части кода:

Код: Выделить всё

emit soundPlay(soundName);
emit soundStop(soundName);
emit soundSetVolume(soundName, static_cast<int>(volume));
emit soundSetPitch(soundName, static_cast<float>(pitch));
Хитрости подпрограмм:
  • soundPlay - воспроизведёт звук с именем soundName, подпрограмма должна вызываться однократно, иначе при многократном вызове звук будет каждый раз при вызове воспроизводится снова.
  • soundStop - остановит звук с именем soundName, может вызыватся многократно, однако данная подпрограмма заточена также для проигрывания звука с метками (loop-stop), при использовании меток должна вызыватся однократно, иначе будет ситуация как в первом случае
  • soundSetVolume - задает громкость звуку с именем soundName в интервале от 0 до 100. Если звук на момент вызова не проигрывается, то произойдёт автоматический, однократный вызов soundPlay(soundName) для воспроизведения звука.
  • soundSetPitch - задает тональность звуку с именем soundName, принимает значение типа float. Если звук на момент вызова не проигрывается, то произойдёт автоматический, однократный вызов soundPlay(soundName) для воспроизведения звука.
Пока с soundManager на сегодня все, если будут обновления данного модуля, то будут добавляться описания новых особенностей слотов.

Ответить