Autor Wątek: Połączenie pathfindingu z unikaniem kolizji i logiką gry  (Przeczytany 3282 razy)

Offline blejd123

  • Użytkownik

# Marzec 17, 2014, 00:52:49
Witam Wszystkich,

Tworzę strategię i chyba ostatnim elementem, który spędza mi sen z powiek jest kwestia połączenia pathfindingu z logiką gry.

Z gotowych rzeczy jest oczywiście A* i Flow Field (dla grup jednostek), do tego fizyka obsługiwana przez Bulleta. Wszystko ładnie działa, jednostki się poruszają, ale tu właśnie dochodzą dodatkowe warunki, które muszę w jakiś sposób zapewnić:

Przypadek 1. Grupa moich jednostek ma na drodze inną grupę moich jednostek
 - standardowo przechodząca grupa powinna odepchnąć jednostki drugiej grupy, albo druga grupa powinna zrobić przejście tej pierwszej (druga grupa może się poruszać, lub stać w miejscu, żeby było ciekawiej)

Przypadek 2. Grupa moich jednostek napotyka na drodze grupę jednostek przeciwnika
 - standardowo moje jednostki powinny obejść przeciwnika dookoła, gdyż jednostki drugiej grupy stanowią na moich przeszkodę, której nie można przesunąć

Jak widać przypadki podobne, ale rozwiązania muszą być dla nich całkiem odmienne. Na razie mam częściowo działające rozwiązanie, ale zawiera ono sporo hacków, bo opiera się o dynamiczną zmianę masy jednostek podczas symulacji - mam podpięty callback pod koniec wykrywania kolizji i jeżeli wykryję np. że moja jednostka chce przejść koło drugiej mojej jednostki i ta druga się nie porusza, to pierwszej zwiększam masę tak, żeby bez problemu odepchnęła drugą; podobnie dla kolizji mojej jednostki z przeciwnikiem - wrogowi zwiększam masę, żeby stanowił cel, którego nie można przesunąć.

Jak to bywa z takimi rozwiązaniami sprawdzają się one do czasu, aż nie napotkamy kolejnych problemów. Jest tu tyle nietypowych sytuacji, że np. dodatkowo muszę sprawdzać, czy jednostka porusza się sama z siebie, czy jest popychana przez inną, bo to wymaga odrobinę innego traktowania. Mogę ustawić, żeby jednostki przeciwnika były traktowane jako przeszkody terenowe i unikane z poziomu pathfindingu, ale będzie to wymagało przechowywania osobnych map dla każdego z graczy, oraz może powodować pewne artefakty w rozwiązaniach (np. jeżeli jednostki będą małe w stosunku do pola mapy, to może istnieć między nimi przejście, przez które przejdzie nasza jednostka, ale zostanie ono pominięte, bo pola te będą wyłączone z wyszukiwania).

Testowałem implementację zawierającą boidy, ale zrezygnowałem z niej, bo też nie działała do końca zgodnie z oczekiwaniami. Zaimplementowałem również wersję, w której jednostki odsuwały się gdy wykryły, że są na drodze poruszającej się jednostki, ale ciężko byłoby zachować wtedy możliwość zbicia jednostek w ciasną grupę, bo starałyby się one rozejść na boki (chyba, że zastosowalibyśmy jakiś bardziej zaawansowany system wykrywający "intencje" sąsiadów).

Jeśli ktoś ma jakikolwiek pomysł jak można to zgrabnie połączyć w całość w taki sposób, żeby nie trzeba było stosować dużej liczby wyjątków, to będę bardzo wdzięczny :D

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline .:NOXY:.

  • Użytkownik
    • Profil

  • +2
# Marzec 17, 2014, 09:58:22
A jakbys tak wizął centroid z tych grup i narysowal tam "wirtualne" kolo i jak sie te kola zetkna to wyznaczyl dla twoich jednostek punkt w tym kole po jego lewej albo prawej stronie tak zeby te skrecily odpowiednio wczesnie? Rozumiesz dodajesz nowy punkt na stos poruszania pominiejszony o ew kolizje. (raytrace z punktu i kierunku [srodek kola - punkt])
« Ostatnia zmiana: Marzec 17, 2014, 10:01:27 wysłana przez .:NOXY:. »

Offline blejd123

  • Użytkownik

# Marzec 17, 2014, 13:14:36
Samo ominięcie się grup nie jest problemem, bo załatwi mi to Flow Field. Dodatkowo trzeba pamiętać, że jednostki mogą być wymieszane, tzn. w ramach jednego zbiorowiska jednostek mogą być obiekty różnych graczy i różnych grup.

Offline .:NOXY:.

  • Użytkownik
    • Profil

  • +2
# Marzec 17, 2014, 20:28:07
W takim razie interesuje cie Collision Avoidance System Youtube

Offline blejd123

  • Użytkownik

# Marzec 17, 2014, 21:10:45
To może rozwiązać część problemów, dzięki NOXY! :D