Korzystam ze znajdowania ścieżek w mojej grze, aby poprowadzić tłum do innego gracza (aby go wykonać). Działa to tak, aby przesłonić odtwarzacz, ale chcę, aby zatrzymali się nieco przed miejscem docelowym (więc wybranie przedostatniego węzła działa dobrze).
Jednak gdy wiele mobów ściga telefon komórkowy, czasami „kładą się jeden na drugim”. Jak najlepiej tego uniknąć? Nie chcę traktować mobów jako nieprzezroczystych i zablokowanych (ponieważ nie są, można przez nie przejść), ale chcę, aby moby miały pewne wyczucie struktury.
Przykład:
Wyobraź sobie, że każdy wąż kierował się do mnie i powinien otaczać „Setsunę”. Zwróć uwagę, jak oba węże wybrały mnie? To nie jest ścisły wymóg; nawet niewielkie przesunięcie jest w porządku. Ale powinni „otoczyć” Setsunę.
źródło
Odpowiedzi:
Daj swoim agentom słaby „ładunek elektrostatyczny”, aby zmusili się do odpychania się nawzajem, zgodnie z prawem Coulomba .
Zakładając dla uproszczenia, że moby powinny odpychać się z równoważną siłą, powinno wystarczyć zastosowanie siły między każdą parą mobów o wielkości
some_constant / distance^2
, gdziesome_constant
jest konfigurowalna siła odpychania idistance
odległość między nimi.Siły odpychania spadają następnie z kwadratem odległości.
Charakter kodeksu ma wielką Przykład (demo) na żywo tutaj . To wygląda tak:
Dopasowywanie każdego elementu do siebie to
O(n^2)
operacja z czasem kwadratowym ( ). Jeśli masz naprawdę dużo agentów, możesz zoptymalizować obliczenia siły za pomocą aproksymacji Barnesa-Huta , która sprowadza się do log-linear (O(n log n)
), ale wymaga kwadratu .źródło
Moje podejście jest podobne do @ Anko, ale oparte na pracy Millingtona i Funge z Artificial Intelligence for Games .
Tak wyglądałoby zachowanie separacji, ale należy wziąć pod uwagę, że prędkość ta powinna być obliczona na podstawie prędkości agenta w funkcji aktualizacji.
źródło