Як додати звук, який може почути AI ворога?


10

Подано:

  • 2D гра зверху вниз
  • Плитки зберігаються просто у двовимірному масиві
  • Кожна плитка має властивість - зволожувати (тому цегла може бути -50 дБ, повітря може бути -1)

З цього я хочу додати його, щоб в точці x1, y1 генерувався звук, і він "вибивається". Зображення нижче накреслює його краще. Очевидно, кінцева мета полягає в тому, щоб ворог AI міг "почути" звук, але якщо стіна блокує його, звук не проходить далеко.

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

Червона - стіна, що має демпфер 50 дБ.

Я думаю, що в 3-й ігровій галочці я плутаю математику.

Який найкращий спосіб здійснити це?


1
Вас хвилює звук, що відбиває / рефлексує взагалі? Тобто, якщо ділянка звукоізоляційної стіни знаходиться безпосередньо між джерелом звуку та AI агентом, але по стіні можна вільно ходити, чи повинен AI-агент все ще чути звук? Якщо відповідь «ні», то оновлюйте кожну клітинку один раз на звук, тож демпфірування застосовується лише один раз до кожного джерела звуку. Якщо у вас є лише кілька AI-агентів, просто простежте рядок від джерела до агента.
Шон Міддлічч

Мета полягає в тому, щоб багато «дурних» агентів стежили за вашими звуками навколо стін, а що ні.
Кріс

Відповіді:


7

Це здається розумною ідеєю, пам’ятайте, хоча це є особливістю геймплея, не ускладнюйте її, ніж те, що потрібно для ігрового процесу.

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

Це, по суті, проблема наведення маршрутів, і, мабуть, найкраще вирішити, використовуючи алгоритм Дейкстри Це пошук в точці один на багато (одне джерело звуку, кілька ворогів), і як таке можна ефективно вирішити, починаючи з однієї точки.

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

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


1
+1 для негайних звукових подорожей. Якщо ви не робите фізичне моделювання, яке піклується про цей матеріал, KISS.
Хакворт

Хммм звучить дуже добре. Я також погоджуюся з @Hackworth щодо простоти. Безпосередній звук був таким "копійкою впала" в хвилину, коли вона була згадана. Я почав читати про алгоритм Діккстри, але лише для підтвердження, він може включати зважені вузли для налаштування для різних типів стін?
Кріс

@Chris Так, Dijkstra також працює з зваженими вузлами, що було б хорошим способом моделювати стіни (наприклад, вага зменшить обсяг тощо)
bummzack

9

Я не думаю, що пошук маршруту не потрібен, просто передайте промінь до кожного ІІ в цьому районі, якщо на шляху є стіна, вони не чують цього. Це найкраще працюватиме з якоюсь графікою сцени + просторовим поділом


Я згоден з цією відповіддю.
bobobobo

Ця структура даних для зберігання звуку також буде набагато простішою.
Кріс

Мені подобається ідея відтворення променів, але я не знаю, чи це би пояснювало звук, що проходить через різні типи стін. Наприклад, маленький ступінчастий звук не проходив би крізь стіну, але звук стрільби з гармати. Але в цьому випадку я не знаю, чи вдасться випромінювати ті чи інші ситуації
Кріс

1
Кріс, просто візьми ідею про радіомовлення та трохи розшири її. Кожен раз, коли промінь перетинає об'єкт, він зменшує гучність звуку на деяку кількість. Якщо гучність зменшується до нуля, перш ніж вона досягне ШІ, її не чути. Якщо він дійсно досягає AI, то у вас є значення "гучності". Ви також можете використовувати такий тип "променевого сліду зі зменшенням гучності", щоб застосувати звукову передачу на відстань.
Тім Холт

@Tim Holt - хороший момент, я не думав так
Кріс

0

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

Передача через плитки - це один із способів (і, мабуть, найефективніший). Просто намалюйте лінію між випромінювачем і приймачем і відніміть значення демпфування кожної комірки на цьому шляху. Якщо число додатне, ви відтворюєте звук.

Якщо ви хочете моделювати непрямий звук, тоді вам доведеться шукати шлях. Поставтеся до випромінювача як до кореня вашого дерева, а кожну сусідню клітинку моделюйте як пов'язаний вузол. Кожне посилання має вартість, відняту від поточного обсягу. Продовжуйте рух по графіку до тих пір, поки ви не знайдете приймач або об'єм не впаде нижче нуля (якщо це так, поверніть назад і спробуйте інший шлях). Якщо до приймача немає позитивної гучності, ваш випромінювач не чути. Примітка: ви не можете просто відмовитися від проїзду, коли ви знайдете приймач, тому що може бути кілька шляхів від емітера до приймача, і вам потрібен той, який має найбільший об'єм.

Якщо ви моделюєте AI, який піклується про те, звідки прийшов звук, останній підхід допоможе - AI буде «чути» звук, що надходить з напрямку останнього відрізка шляху. Приємно, що якщо до приймача є два звукові шляхи, AI вони можуть заплутатися з приводу декількох звуків і в якому напрямку рухатися.


1
Звук - це хвиля, що передається через рідину. Можливо, це не буде доречно моделювати це в грі, але це, звичайно, не "не так, як працює звук".
Кевін Рейд

Справедливий пункт, відредаговано
MrCranky
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.