Jak dodać dźwięk słyszalny przez wrogą AI?

10

Dany:

  • gra 2D z góry na dół
  • Płytki są przechowywane tylko w tablicy 2D
  • Każda płytka ma właściwość - tłumienie (więc cegły mogą wynosić -50db, powietrze może wynosić -1)

Z tego chcę go dodać, aby dźwięk był generowany w punkcie x1, y1 i „falował”. Poniższy obraz przedstawia to lepiej. Oczywiście ostatecznym celem jest to, by wróg AI „słyszał” dźwięk - ale jeśli ściana go blokuje, dźwięk nie dociera tak daleko.

wprowadź opis zdjęcia tutaj

Czerwona to ściana, której tłumienie wynosi 50 dB.

Wydaje mi się, że w trzeciej grze zaznaczam mylącą matematykę.

Jaki byłby najlepszy sposób na wdrożenie tego?

Chris
źródło
1
Czy w ogóle zależy ci na odbijaniu / odbijaniu dźwięku? Oznacza to, że jeśli sekcja dźwiękoszczelnej ściany znajduje się bezpośrednio między źródłem dźwięku a agentem AI, ale ścianę można swobodnie obchodzić, czy agent AI nadal słyszy dźwięk? Jeśli odpowiedź brzmi „nie”, aktualizuj każdą komórkę tylko raz na dźwięk, więc tłumienie jest stosowane tylko raz na każde źródło dźwięku. Jeśli masz tylko kilku agentów AI, po prostu prześledź linię od źródła do agenta.
Sean Middleditch,
Celem jest, aby wielu „głupich” agentów śledziło twoje dźwięki wokół ścian, a co nie.
Chris

Odpowiedzi:

7

Wydaje się to rozsądnym pomysłem, pamiętaj jednak, że jest to funkcja rozgrywki, nie komplikuj jej bardziej niż jest to wymagane do rozgrywki.

Zmieniłbym twój schemat, aby dźwięk rozprzestrzeniał się natychmiast, ponieważ jest to prawdopodobnie łatwiejsze do zaprogramowania i wydaje się bardziej spójne z szybkim rozprzestrzenianiem się prawdziwego dźwięku.

Jest to zasadniczo problem ze znalezieniem ścieżki i prawdopodobnie najlepiej go rozwiązać za pomocą algorytmu Dijkstry. To wyszukiwanie od jednego do wielu punktów (jedno źródło dźwięku, wielu wrogów) i jako takie można skutecznie rozwiązać, zaczynając od pojedynczego punktu.

Zaczynasz od zrobienia rozkładówki ze źródła i zaznacz wszystkich sąsiadów, którzy jeszcze nie zostali zaznaczeni i mają obliczoną objętość powyżej 0, każdego z tych sąsiadów, których dodasz do listy. Ta lista musi być posortowana według obliczonej objętości. Następnie powtarzasz proces dla pozycji o najwyższym wolumenie na liście, dodając w razie potrzeby nowe wpisy do listy i usuwając ten, który obsłużyłeś. Powtarzaj, aż lista będzie pusta.

Za każdym razem, gdy podczas tego procesu dojdziesz do płytki z wrogiem, wiesz, jaką głośność słyszy ten wróg.

aaaaaaaaaaaa
źródło
1
+1 za natychmiastową podróż dźwiękiem. Chyba że robisz symulację fizyki, która dba o to, KISS.
Hackworth,
Hmmm brzmi naprawdę dobrze. Zgadzam się również z @Hackworth w kwestii uproszczenia. Natychmiastowy dźwięk był taki, że „grosz spadł” w momencie, gdy o nim wspomniano. Zacząłem czytać o algorytmie Dijkstry, ale żeby to potwierdzić, może zawierać ważone węzły, aby dostosować się do różnych typów ścian?
Chris
@Chris Tak, Dijkstra's działa również z ważonymi węzłami, które byłyby dobrym sposobem na modelowanie ścian (np. Ciężar zmniejszy objętość itp.)
bummzack
9

Nie wydaje mi się, że szukanie ścieżki jest konieczne, wystarczy rzucić promieniowo na każdą sztuczną inteligencję w okolicy, jeśli na drodze jest ściana, nie słyszą jej. Najlepiej działałoby to z jakimś rodzajem wykresu scen + podział przestrzenny

CobaltHex
źródło
Zgadzam się z tą odpowiedzią.
bobobobo
Ta struktura danych do przechowywania dźwięku również będzie znacznie prostsza.
Chris
Podoba mi się pomysł oddania promienia, ale nie wiem, czy to tłumaczy dźwięk przechodzący przez różne typy ścian. Na przykład odgłos małego kroków nie przeszedłby przez ścianę, ale odgłos wystrzału z pistoletu. Ale w tym przypadku nie wiem, czy rzutowanie promieniami rozwiązałoby te sytuacje
Chris
1
Chris, po prostu weź pomysł na raycast i trochę go rozwinąć. Za każdym razem, gdy promień przecina obiekt, zmniejsza głośność dźwięku o pewną wartość. Jeśli głośność zostanie zmniejszona do zera, zanim osiągnie AI, nie zostanie usłyszana. Jeśli osiągnie AI, oznacza to, że masz pod ręką wartość „głośności”. Możesz także użyć tego rodzaju „śledzenia promieni ze zmniejszeniem głośności”, aby zastosować spadek dźwięku na odległość.
Tim Holt
@Tim Holt - dobra uwaga, nie myślałem w ten sposób
Chris
0

Myślę, że twoja implementacja zakłada, że ​​poziom dźwięku w komórce jest kumulatywny i że amplituda po prostu przesuwa się równomiernie na zewnątrz we wszystkich kierunkach. Dźwięk nie rozchodzi się klatka po klatce, albo jest odtwarzany, albo nie, i chcesz znaleźć amplitudę odtwarzania w dowolnym momencie.

Raycasting przez kafelki jest jednym ze sposobów (i prawdopodobnie najbardziej efektywnym) robienia tego. Wystarczy narysować linię między emiterem a odbiornikiem i odjąć wartość tłumienia każdej komórki po drodze. Jeśli liczba jest dodatnia, odtwarzasz dźwięk.

Jeśli chcesz modelować dźwięk pośredni, musisz znaleźć ścieżkę. Traktuj emiter jako korzeń drzewa i modeluj każdą sąsiadującą komórkę jako połączony węzeł. Każdy link ma koszt odejmowany od bieżącego wolumenu. Przechodź dalej przez wykres, aż znajdziesz odbiornik lub poziom głośności spadnie poniżej zera (jeśli tak, cofnij się i spróbuj innej ścieżki). Jeśli nie ma ścieżek do odbiornika o dodatniej głośności, emitera nie słychać. Uwaga: nie możesz po prostu przejść przez przechodzenie, gdy znajdziesz odbiornik, ponieważ może istnieć wiele ścieżek od emitera do odbiornika i potrzebujesz tej o największej głośności.

Jeśli modelujesz sztuczną inteligencję, która dba o to, skąd pochodzi dźwięk, to drugie podejście pomoże - AI będzie „słyszał” dźwięk dochodzący z kierunku ostatniego segmentu na ścieżce. Cóż, jeśli istnieją dwie słyszalne ścieżki do odbiornika, sztuczna inteligencja może być mylona co do wielu dźwięków i kierunku.

MrCranky
źródło
1
Dźwięk jest falą przenoszoną przez płyn. Symulacja tego w grze może być niewłaściwa, ale z pewnością nie jest to „nie sposób, w jaki działa dźwięk”.
Kevin Reid
Sprawiedliwy punkt, pod redakcją
MrCranky