Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Albul

Рейтинг: 4.50. Голосов: 4.

Имитация звука двигателя в Flash

Запись от Albul размещена 24.05.2012 в 00:11
Обновил(-а) Albul 24.05.2012 в 07:39

Давно стояла передо мною задача как нибудь реалистично сымитировать работу двигателя у своих флешках. Сейчас решил поделиться найденным решением.
В общем задача в следующем, нужно чтобы звук мотора реагировал на изменение педали акселератора. При увеличении газа - звук должен моментально увеличивать частоту. Раньше я просто изменял громкость звука мотора через класс 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). В обработчику изменяем частоту звука двигателя, в зависимости от значения педали. Делаем это по логарифмическому закону:
Код AS3:
private function onAcceleratorChanged(e:Event):void {
	soundLibrary.changeEngine(Math.log(pedal.value + 3) / 4, Math.log(pedal.value + pedal.value / 2 + 20) / 4);
}
Здесь лежат исходники проекта: Скачать

Если у кого то есть решение по лаконичнее, отпишите хоть чем пользуетесь
Всего комментариев 6

Комментарии

Старый 25.05.2012 15:01 ~~~ вне форума
~~~
 
Аватар для ~~~
Всё здорово и интересно. Спасибо. Вероятно, пригодится.

Единственное замечание: я бы оптимизировал метод sampleData, ибо он вызывается раз в сэмпл, а это очень дофига. Вместо объявления перимаенных, объявлять константы (например data, scaledBlockSize, positionInt,..) или вынести в поля экземпляра класса. И, да, сэмплы кешировать бы. Иначе на слабых машинах гарантировано будут проблемы.
Старый 01.06.2012 22:22 PainKiller вне форума
PainKiller
 
Аватар для PainKiller
Здорово. И ваш блог очень понравился, особенно трехмерные шашки.
Старый 17.08.2012 20:36 FieryWall вне форума
FieryWall
 
Аватар для FieryWall
Можно проще обойти проблему с mp3, т.к. во флеш это уже предусмотрено. необходимо просто напросто сохранять качественный звук wav и при публикации swc файла поставить конвертацию в mp3. Результат: маленький размер звукового файла + нет проблемы с пустыми участками, флеш при конвертации их попросту чистит.
Старый 22.08.2012 15:12 alecsisk вне форума
alecsisk
Очень напомнило работу двигателей в первой GTA
Старый 23.08.2012 17:22 TERRORist вне форума
TERRORist
 
Аватар для TERRORist
А навскидку, осилит старый нетбук штук 10 таких вот звуков, динамически меняющихся, плюс отрисовку графики? Для игр - гонок применимо?
Старый 16.10.2012 17:59 FieryWall вне форума
FieryWall
 
Аватар для FieryWall
Кстати, в чудо классе есть несколько недостатков:
Код AS3:
_target.position = 0;
var read: int = _mp3.extract(_target, need, positionInt );
при екстракте массива байтов позиция меняется, и строчку с заданием позиции необходимо расположить после екстракта, в ином случае ее смысл теряется, и часто вылетает ошибка "обнаружения конца файла"
Код AS3:
var read: int = _mp3.extract(_target, need, positionInt );
_target.position = 0;
и по ссылке в комментариях пишут о фиксе:
Код AS3:
if (_position > (_mp3.bytesTotal * 2) – _skip_bytes_at_end)
Без него вы просто половините звук)

TERRORist
Для гонок - вполне, 10 штук - точно не потянет =)
Обновил(-а) FieryWall 16.10.2012 в 18:32
 
Последние записи от Albul

 


Часовой пояс GMT +4, время: 02:33.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.