Как добавить звук, который слышит вражеский ИИ?

10

Данный:

  • 2D сверху вниз игра
  • Плитки хранятся только в 2D массиве
  • У каждой плитки есть свойство - гаснет (поэтому кирпичи могут быть -50 дБ, воздух - -1)

Отсюда я хочу добавить его, чтобы в точке x1, y1 генерировался звук, и он «выбегает». Изображение ниже как бы обрисовывает в общих чертах это. Очевидно, что конечной целью является то, что искусственный враг может «слышать» звук - но если стена блокирует его, звук не распространяется так далеко.

введите описание изображения здесь

Красная стена, которая имеет влажность 50 дБ.

Я думаю, что в третьем тике игры я путаю математику.

Каков наилучший способ реализации этого?

Крис
источник
1
Вы заботитесь о звуке, отражающем / отражающемся вообще? То есть, если участок звуконепроницаемой стены находится непосредственно между источником звука и агентом ИИ, но стену можно свободно обойти, должен ли агент ИИ все еще слышать звук? Если ответ отрицательный, обновляйте каждую ячейку только один раз для каждого звука, поэтому демпфирование применяется только один раз для каждого источника звука. Если у вас есть только несколько агентов ИИ, просто проследите линию от источника к агенту.
Шон Мидлдич
Цель состоит в том, чтобы заставить многих «глупых» агентов следовать вашим звукам за стенами, а что нет.
Крис

Ответы:

7

Это кажется разумной идеей, но помните, что это особенность игрового процесса, не делайте ее более сложной, чем требуется для игрового процесса.

Я бы изменил вашу схему, чтобы звук сразу распространялся, так как это, вероятно, проще для программирования и кажется более совместимым с быстрым распространением реального звука.

По сути, это проблема поиска пути, и, вероятно, ее лучше всего решить с помощью алгоритма Дейкстры. Это поиск по многим точкам (один источник звука, несколько врагов), и его можно эффективно решить, начиная с одной точки.

Вы начинаете с выполнения спреда из источника и отмечаете всех соседей, которые еще не были помечены и имеют расчетный объем выше 0, каждого из этих соседей, которого вы добавляете в список. Этот список должен быть отсортирован по расчетному объему. Затем вы повторяете процесс для записи с наибольшим объемом в списке, добавляя новые записи в список по мере необходимости и удаляя обработанную вами. Повторяйте, пока список не станет пустым.

Всякий раз, когда вы во время этого процесса достигаете плитки с врагом, вы знаете, какой объем слышит этот враг.

AAAAAAAAAAAA
источник
1
+1 для немедленного звукового путешествия. Если вы не делаете физическую симуляцию, которая заботится об этом, KISS.
Хакворт
Хммм звучит действительно хорошо. Я также согласен с @Hackworth о простоте. Немедленный звук был таким «пенни упал» в тот момент, когда он был упомянут. Я начал читать об алгоритме Дейкстры, но просто для подтверждения, он может включать взвешенные узлы для настройки для различных типов стен?
Крис
@Chris Да, Dijkstra's также работает с взвешенными узлами, которые были бы хорошим способом моделирования стен (например, вес уменьшит объем и т. Д.)
bummzack
9

Я не думаю, что поиск пути необходим, просто наведение лучей на каждого ИИ в этой области, если на пути есть стена, они этого не слышат. Это лучше всего подойдет для какого-то графа сцены + пространственного разделения

CobaltHex
источник
Я согласен с этим ответом.
Бобобобо
Эта структура данных для хранения звука также будет намного проще.
Крис
Мне нравится идея создания лучей, но я не знаю, объясняет ли это звук, проходящий через различные типы стен. Например, небольшой шаговый звук не прошел бы сквозь стену, но звук выстрела из пистолета. Но в этом случае я не знаю, решит ли приведение лучей эти ситуации
Крис
1
Крис, просто возьми идею Raycast и немного углубься в нее. Каждый раз, когда луч пересекает объект, он на несколько уменьшает громкость звука. Если громкость снижается до нуля, прежде чем он достигнет ИИ, он не слышен. Если он достигает ИИ, значит, у вас есть «громкость». Вы также можете использовать этот тип «трассировки лучей с уменьшением громкости», чтобы применить звуковой спад на расстоянии.
Тим Холт
@ Тим Холт - хорошая мысль, я не думал об этом
Крис
0

Я думаю, что ваша реализация предполагает, что уровень звука в ячейке является кумулятивным, и что амплитуда просто движется наружу равномерно во всех направлениях. Звук не распространяется, кадр за кадром, он либо играет, либо нет, и вы хотите определить амплитуду, в которой он будет воспроизводиться для любой заданной точки.

Raycasting через плитки является одним из способов (и, вероятно, самый эффективный способ) сделать это. Просто проведите линию между излучателем и приемником и вычтите значение демпфирования каждой ячейки по пути. Если число положительное, вы воспроизводите звук.

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

Если вы моделируете ИИ, который заботится о том, откуда исходит звук, последний подход поможет - ИИ будет «слышать» звук, исходящий из направления последнего сегмента пути. Хорошо, если есть два слышимых пути к приемнику, их ИИ может быть сбит с толку из-за множества звуков и того, какое направление выбрать.

MrCranky
источник
1
Звук - это волна, передаваемая через жидкость. Возможно, было бы неуместно моделировать это таким образом в игре, но это, конечно, не «не так, как работает звук».
Кевин Рейд
Fair point, отредактировано
MrCranky