Представим, что есть в некоей абстрактной игре некий абстрактный дом, который внезапно начинает разлетаться на десяток-другой частей. Части (пусть будут кирпичи, например) разлетаются быстро, многократно сталкиваются друг с другом, с соседними домами.
Цель - озвучить столкновения.
Проблема - собственно озвучка :) Столкновений в единицу времени происходит много, поэтому если проигрывать звук удара каждую коллизию, получается невнятная каша. Если запускать не более х звуков в секунду одновременно, то получается какой-то отбойный молоток - монотонный бум-бум-бум-бум. Если опускать часть звуков то игрок, наблюдая за отдельным кирпичом удивится отсутствию звука. Это особо заметно, если выходит, что пропускается какой-нибудь яркий звук, например бьющееся стекло.
Пробовал найти какое-то промежуточное решение, но как ни крутил, приятного уху варианта не нашёл.
Как решается подобная проблема? Решается ли она математически? Что почитать по этой теме неспециалисту? Что лично вы посоветуете?
xy2041
> Что лично вы посоветуете?
Вроде как при наложении звук один в один должен просто стать громче. И еще хорошо бы не одним типом звука озвучивать.
xy2041
Тяжело без звукача да?)
Проигрываться должен заранее записанный сэмпл разрушения множества объектов.
OnSoundWaves
> Проигрываться должен заранее записанный сэмпл разрушения множества объектов.
Я бы согласился, что тяжело без звукача, но все таки, скажем, при артиллерийских залпах в игре это не приемлемо, слишком много вариантов.
OnSoundWaves
А отдельно звуками занимаетесь? Выстрелы, взрывы и т.д.?
xy2041
> Если запускать не более х звуков в секунду одновременно, то получается какой-то
> отбойный молоток
Почему? Делаем, допустим, 16 звуков максимум. Каждый новый звук включается вместо самого старого. Самый старый - не обязательно тот, который раньше всех начался. Может он начался позже, но более короткий, до конца осталось меньше. Алгоритм выбора нужно подбирать исходя из характера звуков.
Ни в коем случае нельзя использовать один звук для нескольких, к примеру, пушек - можно словить очень неприятный эффект интерференции звуков. Желательно иметь 3-4 разных семплов выстрела и использовать их по очереди.
Начну сначала. Разделите ваши звуки на логические группы. Например: кирпичи, дерево, стекло. Удары, треск и прочее.
Возьмём одну группу: кирпичи. А именно, их коллизии. Для того, чтобы не было "эффекта пулемёта" (повтор одного и того же звука), вам нужно создать несколько разных звуков, предположим, 5 штук.
Далее. Есть такое понятие - модуляция. Программными функциями можно изменять, скажем, питч звука на десятые-сотые доли. Также стоит ввести функцию, не дающую повторяться одному и тому же звуку дважды подряд. Так, из пяти звуков, при условии долей, вы увеличиваете их количество в несколько раз.
Это один из способов добиться желаемого результата.
IK-Sound
в точку.
IK-Sound
Да.
IK-Sound
> Есть такое понятие - модуляция. Программными функциями можно изменять, скажем,
> питч звука на десятые-сотые доли.
Да. Думаю даже менять в значительных пределах.
Большое разнообразие внесет градация уровня воспроизведения в зависимости от расстояния до сталкивающихся объектов.
Лучше такую градацию сделать по экспоненциальной функции, по такой же зависимости поставить нарастание фильтра низких частот.
(Чем дальше расстояние тем сильнее закрывается фильтр).
Только все это будет нагружать... Возможно вам это не подойдет... Может просто сделать продолжительный эффект разлетающегося чегото, бьющегося и ломающегося. за которым по логике один кирпич и не должет быть слышен. и только яркие моменты(стекло, огромный камень, целая крыша ) прописать дополнительно?
Хотя никто не знает Вашей игры возможно Вам надо все в деталях как в кино..)) А?
Написали бы лучше Вашу проблему, а не абстрактный дом и абстрактные кирпичи...видите! люди с готовностью подсказывают...так быстрее было бы...
OnSoundWaves
> Тяжело без звукача да?)
Да, я думал, тут какое-то элементарное решение или четкий алгоритм есть. Оказывается, все поинтереснее будет )
Mikle
> Ни в коем случае нельзя использовать один звук для нескольких, к примеру, пушек
> - можно словить очень неприятный эффект интерференции звуков.
Не уверен, что до конца понимаю, что это значит на самом деле, но мне кажется, что именно это в моей ситуации и происходит :)
ikeike555
> Хотя никто не знает Вашей игры возможно Вам надо все в деталях как в кино..))
> А?
> Написали бы лучше Вашу проблему, а не абстрактный дом и абстрактные
> кирпичи...видите! люди с готовностью подсказывают...так быстрее было бы...
Окей, описываю. Игра - 2D physics based arcade для ios/android (cocos2d-x/box2d). Игра поделена на уровни, каждый размером с экран, т.е никакого скроллинга - все объекты всегда перед глазами у игрока. На уровне размещаются главный герой и различного вида конструкции, собранные из отдельных частей - кирпичей, камней, стекол, деревяшек (50-100 объектов на уровень). Игрок расставляет бомбы (1-5) и нажимает "старт". После этого героя колбасит взрывами по уровню, который рассыпается и разлетается на части. Цель - перекинуть героя из точки А в точку Б. Время симуляции в среднем 5-15 секунд, количество столкновений за симуляцию от 100 до много.
Если сильно постараться, то можно увидеть дааалекую аналогию с теми самыми злыми птицами. Только старт прямо изнутри конструкции, и элементов побольше и скорость симуляции выше. К сожалению, по политическим причинам не могу пошарить скрин.
Исходя из вышесказанного, как в кино - не надо.
ikeike555
> Может просто сделать продолжительный эффект разлетающегося чегото, бьющегося и
> ломающегося. за которым по логике один кирпич и не должет быть слышен
Была такая мысль, но, к сожалению, не сочетается со сценой никак.
ikeike555
> Большое разнообразие внесет градация уровня воспроизведения в зависимости от
> расстояния до сталкивающихся объектов.
> Лучше такую градацию сделать по экспоненциальной функции, по такой же
> зависимости поставить нарастание фильтра низких частот.
> (Чем дальше расстояние тем сильнее закрывается фильтр).
Эта идея мне нравится, но, к сожалению, технически её не потяну. Попробую прикрутить банальную линейную (и потом для сравнения экспоненциальную) зависимость громкости от силы удара.
IK-Sound
> Начну сначала. Разделите ваши звуки на логические группы. Например: кирпичи,
> дерево, стекло. Удары, треск и прочее.
> Возьмём одну группу: кирпичи. А именно, их коллизии. Для того, чтобы не было
> "эффекта пулемёта" (повтор одного и того же звука), вам нужно создать несколько
> разных звуков, предположим, 5 штук.
Эта идея тоже понравилась, работаю в этом направлении.
IK-Sound
> Также стоит ввести функцию, не дающую повторяться одному и тому же звуку дважды
> подряд.
Это было самой первой моей идеей, но почему-то на практике никакой разницы не заметил. Но ещё надо посмотреть вместе с другими вариантами.
xy2041
> Это было самой первой моей идеей, но почему-то на практике никакой разницы не
> заметил. Но ещё надо посмотреть вместе с другими вариантами.
Делаешь массив, например на 5 разных звуков для одного и того же события, как тут уже посоветовали. И номер текущего звука, при старте звука играешь звук с номером и сразу увеличиваешь номер на 1, как достигнешь максимального количества сбрасываешь в 0. Это гарантирует что никогда не будет повторов. Можно и рандомно выбирать, но на практике разницы не заметно.
Может я уже слишком давно не озвучивал коробочных игр, но скорее всего наиболее реалистичным будет самое простое решение - запускать один звук, в котором есть разбивание стены/части стены/нескольких кирпичей.
Максимум действительно можно разбить по группам - камень, дерево, стекло. Но не складывать разбивание стены из многих звуков разбивания отдельных кирпичей.
Помимо того, что это больше времени займет чтобы запрограммировать, это и хуже будет звучать чем один звук на разбивание группы кирпичей/досок/стекол.
Тема в архиве.