Данный:
- 2D сверху вниз игра
- Плитки хранятся только в 2D массиве
- У каждой плитки есть свойство - гаснет (поэтому кирпичи могут быть -50 дБ, воздух - -1)
Отсюда я хочу добавить его, чтобы в точке x1, y1 генерировался звук, и он «выбегает». Изображение ниже как бы обрисовывает в общих чертах это. Очевидно, что конечной целью является то, что искусственный враг может «слышать» звук - но если стена блокирует его, звук не распространяется так далеко.
Красная стена, которая имеет влажность 50 дБ.
Я думаю, что в третьем тике игры я путаю математику.
Каков наилучший способ реализации этого?
Ответы:
Это кажется разумной идеей, но помните, что это особенность игрового процесса, не делайте ее более сложной, чем требуется для игрового процесса.
Я бы изменил вашу схему, чтобы звук сразу распространялся, так как это, вероятно, проще для программирования и кажется более совместимым с быстрым распространением реального звука.
По сути, это проблема поиска пути, и, вероятно, ее лучше всего решить с помощью алгоритма Дейкстры. Это поиск по многим точкам (один источник звука, несколько врагов), и его можно эффективно решить, начиная с одной точки.
Вы начинаете с выполнения спреда из источника и отмечаете всех соседей, которые еще не были помечены и имеют расчетный объем выше 0, каждого из этих соседей, которого вы добавляете в список. Этот список должен быть отсортирован по расчетному объему. Затем вы повторяете процесс для записи с наибольшим объемом в списке, добавляя новые записи в список по мере необходимости и удаляя обработанную вами. Повторяйте, пока список не станет пустым.
Всякий раз, когда вы во время этого процесса достигаете плитки с врагом, вы знаете, какой объем слышит этот враг.
источник
Я не думаю, что поиск пути необходим, просто наведение лучей на каждого ИИ в этой области, если на пути есть стена, они этого не слышат. Это лучше всего подойдет для какого-то графа сцены + пространственного разделения
источник
Я думаю, что ваша реализация предполагает, что уровень звука в ячейке является кумулятивным, и что амплитуда просто движется наружу равномерно во всех направлениях. Звук не распространяется, кадр за кадром, он либо играет, либо нет, и вы хотите определить амплитуду, в которой он будет воспроизводиться для любой заданной точки.
Raycasting через плитки является одним из способов (и, вероятно, самый эффективный способ) сделать это. Просто проведите линию между излучателем и приемником и вычтите значение демпфирования каждой ячейки по пути. Если число положительное, вы воспроизводите звук.
Если вы хотите смоделировать непрямой звук, вам придется найти путь. Рассматривайте излучатель как корень вашего дерева и моделируйте каждую соседнюю ячейку как связанный узел. Каждая ссылка имеет стоимость, вычтенную из текущего объема. Продолжайте перемещаться по графику, пока либо вы не найдете приемника, либо объем не упадет ниже нуля (если это произойдет, вернитесь назад и попробуйте другой путь). Если нет путей к приемнику с положительной громкостью, ваш излучатель не будет слышен. Примечание: вы не можете просто отказаться от обхода, когда найдете приемник, потому что может быть несколько путей от излучателя к приемнику, и вам нужен тот, который имеет наибольшую громкость.
Если вы моделируете ИИ, который заботится о том, откуда исходит звук, последний подход поможет - ИИ будет «слышать» звук, исходящий из направления последнего сегмента пути. Хорошо, если есть два слышимых пути к приемнику, их ИИ может быть сбит с толку из-за множества звуков и того, какое направление выбрать.
источник