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.
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?
Odpowiedzi:
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.
źródło
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
źródło
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.
źródło