Имитация звука двигателя в Flash
Давно стояла передо мною задача как нибудь реалистично сымитировать работу двигателя у своих флешках. Сейчас решил поделиться найденным решением.
В общем задача в следующем, нужно чтобы звук мотора реагировал на изменение педали акселератора. При увеличении газа - звук должен моментально увеличивать частоту. Раньше я просто изменял громкость звука мотора через класс SoundTransform. Но такое решение никому особо не нравилось . Пробовал использовать для этих целей набор классов soundtouch-as3, но ничего толком не получилось. Затем наткнулся в интернете вот на этот класс: Pitch-Shift-MP3. Немного модифицировал его под свои нужды, и вуаля. Теперь им можно не только частоту изменять, но и громкость звука одновременно.
Вот что получилось:
EngineLoop1.swf
А это изменение громкости и частоты одновременно:
EngineLoop1.swf
Есть такой неприятный момент в MP3 формате - он всегда вставляет в начало и в конец дорожки пустые семплы, их просто от туда никак не искоренить. И если у нас есть дорожка из зацикленным звуком мотора, то циклично проигрывая ее, мы получим щелканья каждый такт. Для преодоления этого в классе PitchShiftMP3 есть два параметра: skip_bytes_at_start и skip_bytes_at_end. Которые соответственно указывают сколько нужно пропускать байтов в начале и в конце трека, получается проигрываться будет только серединка трека. Для каждого отдельного звукового файла эти параметры нужно подбирать отдельно. Так для звука трактора методом тыка я определил: skip_bytes_at_start = 3072, skip_bytes_at_end = 0, а для камаза: skip_bytes_at_start = 512, skip_bytes_at_end = 256.
В классе SoundLibrary имеется 3 функции:
- onEngineBelarus() - включает звук мотора трактора.
- offEngineBelarus() - включает звук мотора камаза
- changeEngine() - изменяет частоту и громкость включенного звука мотора.
В главном классе Main, подписываемся на событие изменения значения педали (она изменяется от 0 до 100). В обработчику изменяем частоту звука двигателя, в зависимости от значения педали. Делаем это по логарифмическому закону:
private function onAcceleratorChanged(e:Event):void { soundLibrary.changeEngine(Math.log(pedal.value + 3) / 4, Math.log(pedal.value + pedal.value / 2 + 20) / 4); }
Если у кого то есть решение по лаконичнее, отпишите хоть чем пользуетесь
Всего комментариев 6
Комментарии
01.06.2012 22:22 | |
Здорово. И ваш блог очень понравился, особенно трехмерные шашки.
|
22.08.2012 15:12 | |
Очень напомнило работу двигателей в первой GTA
|
23.08.2012 17:22 | |
А навскидку, осилит старый нетбук штук 10 таких вот звуков, динамически меняющихся, плюс отрисовку графики? Для игр - гонок применимо?
|
16.10.2012 17:59 | |
Кстати, в чудо классе есть несколько недостатков:
при екстракте массива байтов позиция меняется, и строчку с заданием позиции необходимо расположить после екстракта, в ином случае ее смысл теряется, и часто вылетает ошибка "обнаружения конца файла" и по ссылке в комментариях пишут о фиксе: Без него вы просто половините звук) TERRORist Для гонок - вполне, 10 штук - точно не потянет =) |
|
Обновил(-а) FieryWall 16.10.2012 в 18:32
|
Последние записи от Albul
- Имитация звука двигателя в Flash (24.05.2012)