Я думаю, что ваша реализация предполагает, что уровень звука в ячейке является кумулятивным, и что амплитуда просто движется наружу равномерно во всех направлениях. Звук не распространяется, кадр за кадром, он либо играет, либо нет, и вы хотите определить амплитуду, в которой он будет воспроизводиться для любой заданной точки.
Raycasting через плитки является одним из способов (и, вероятно, самый эффективный способ) сделать это. Просто проведите линию между излучателем и приемником и вычтите значение демпфирования каждой ячейки по пути. Если число положительное, вы воспроизводите звук.
Если вы хотите смоделировать непрямой звук, вам придется найти путь. Рассматривайте излучатель как корень вашего дерева и моделируйте каждую соседнюю ячейку как связанный узел. Каждая ссылка имеет стоимость, вычтенную из текущего объема. Продолжайте перемещаться по графику, пока либо вы не найдете приемника, либо объем не упадет ниже нуля (если это произойдет, вернитесь назад и попробуйте другой путь). Если нет путей к приемнику с положительной громкостью, ваш излучатель не будет слышен. Примечание: вы не можете просто отказаться от обхода, когда найдете приемник, потому что может быть несколько путей от излучателя к приемнику, и вам нужен тот, который имеет наибольшую громкость.
Если вы моделируете ИИ, который заботится о том, откуда исходит звук, последний подход поможет - ИИ будет «слышать» звук, исходящий из направления последнего сегмента пути. Хорошо, если есть два слышимых пути к приемнику, их ИИ может быть сбит с толку из-за множества звуков и того, какое направление выбрать.