14 февраля 2011

Squall: рёв двигателя!

Для многих техник в играх можно увидеть приставку "программная(ый)": например, программная анимация, программный спец-эффект, программный ландшафт, программная текстура и т.д. В чем заключается такая добавка к выражению? Все очень просто. Дело в том, что всю игру можно условно разделить на две составляющие: контент (содержимое, наполнение игры, например графика или музыка) и программистскую часть, состоящую из кода самой игры. Так вот под "программным" понимают то, что некоторый контент создается с помощью программирования: формул и алгоритмов. Сегодня как раз поговорим о том, как можно программно создать звук гудящего мотора мотоцикла или автомобиля.
Скажу еще пару фраз о "программной" генерации чего-либо в игре. К примеру, нужно создать текстуру чешуи, на которой тысячи чешуек. Рисовать все вручную довольно утомительно. А вот заранее заготовить одну чешуинку, а потом программным образом раскидать тысячу раз по текстуре и получить необходимое - самое верное решение! Таким же образом, можно получить вот такие изображения:
которые можно использовать в самых разных целях: от текстур для вулканов до замысловатых карт ландшафтов.
Программное получение необходимых эффектов очень распространено, поэтому сильно удивляет, когда люди, считающие себя близкими к gamedev'у, говорят фразы типа "да ты нарисуй две тысячи чешуинок, и такое используй". Сразу хочется сказать: "а сам попробуй?"
В этой теме как раз прозвучал вопрос как сделать рев двигателя, точнее как модулировать его частоту, чтобы было похоже на изменение оборотов. Один из ответов "заготовь несколько семплов звука и проигрывай разные" меня поверг в шок. Именно поэтому я и пишу сейчас данное сообщение, чтобы объяснить, что для звука двигателя всегда лучше использовать модуляцию частоты (или скорости воспроизведения) - так проще и дешевле.
Итак, что мы имеем? Звук двигателя, Delphi, Squall (у автора темы в арсенале FMod, но он платен, поэтому забудем об этом звуковом движке). Что нужно уметь? Модулировать частоту звука, чтобы было похоже на изменение оборотов двигателя авто.
Задача определена, исходные данные тоже, поэтому - приступим!
Сразу пороемся в заголовочном файле squall.pas и найдем там вот такие две порт-функции:
SQUALL_Channel_GetFrequency()
SQUALL_Channel_SetFrequency()
Ясно, нужно использовать их. Первую - для получения частоты дискретизации файла, вторую - для ее модуляции с целью изменения итогового звука.
Итак, накидываем простенькую демку и получаем вот такой вид программы:

Верхний ползунок как раз меняет частоту звука, делая похожим этот эффект на рёв мотора! Отлично! Нижний ползунок отвечает за громкость. Ну и две стандартные кнопки: Play и Pause.
Исходники можно забрать отсюда.
Для веселья можно запустить файл с каким-нибудь голосом, ведь измененным он будет звучать безумно смешно!

Вот и все на этом, демка получилась очень простой, но поучительной составляющей в ней намного больше: не стоит пренебрегать алгоритмическими возможностями и сразу говорить "это нужно нарисовать" или "анимировать нужно вручную". Ведь на свете много программистов - возможно, они смогут помочь в данной проблеме?! ;)

Сообщения, схожие по тематике:

2 коммент.:

  1. Такой подход использовался в старых Carmageddon'ах, и он не совсем корректен. В современных NFS'ах за рёв двигателя отвечает с десяток аналогичным образом модулируемых, но интерполирующихся между собой сэмпов )
    Когда-то занимался синтезом звуков и текстурок, в итоге получился такой вот редактор:
    http://vkontakte.ru/photo465975_91369352
    и такая 11 кб демка сгенерированного контента:
    http://vkontakte.ru/photo465975_91369343 )

    ОтветитьУдалить
  2. XProger, Спасибо за поправку!
    Конечно, использование всего одного звукового сэмпла на двигатель - будет давать не шикарный результат. Но для достижения "современного" звука интерполируемые сэмплы все равно придется модулировать по частоте, подгоняя друг к другу так сказать. Как это программно делается я и пытался показать...

    по поводу редактора - выглядит очень вкусно! есть демка, чтобы испробовать?

    p.s. кстати, blogspot идентифицирует комменты со ссылками как спам и закидывает куда-то далеко. Сейчас еле нашел, как отменить на твой комментарий пометку "спам".
    Никто не знает, как все комментарии по умолчанию пропускать, чтобы руками ничего делать не приходилось?

    ОтветитьУдалить