63 boty dzielone na 3 teamy + star wars + problem z kolizja

0

No tam widac 63 boty ale tylko 42 do siebie strzelaja, kazdy pojedynczy strzal to taki swietlik zielony lub niebieski problem w tym, ze musze sprawdzac dla jednego takiego swietlika 42*2 kolizje,l a dla jednego takiego bota tych swietylikow moze byc 128 dlatego tez zwieksza mi sie to masakierycznie wielko, da sie jakos usprawnic testowanie kolizji czy jeden koles strzelil w drugiego pomijajac tyle obliczeń

0

czemu x2 ? jeżeli to ma być prosta kolizja to wystarczy że sprawdzisz czy odległość od środka bota jest mniejsza niż jego wysokość/2 (traktując że bot to sfera) lub ew. dopiero przy spełnieniu tego warunku sprawdzać dokładnie gdzie trafiła kula (a to już więcej obliczeń ale dla konkretnego jednego już tylko bota)
czyli obliczeń będzie dokładnie tyle ile jest botów na mapie a to jest naprawdę mało

0

komputer nie świat i musze sprawdzać kolizje w przedziałach czasowych.
1 test to: dystans bota od swietlika
2 test to: odleglosc bota od linii (ktora jest tworzona przez stara pozycje swietlika i aktualna pozycje).

czyli obliczeń będzie dokładnie tyle ile jest botów na mapie a to jest naprawdę mało

nie bo dla jednego bota jest takich swietlikow maksymalnie 128 wiec dla jednego swietlika sprawdzam 42 kolizje razy dwa testy, a dla jednego bota to jeszcze sie mnozy razy 128

czyli 422128*63 = 677376

0

ja bym się zabrał za to inaczej

  1. wyznaczył prostą, po której strzela każdy boot
    a) nie wiem czy może ale po zmianie kierunku stara prosta zostaje i tworzy się nowa
    b) stara prosta jest usuwana z listy po tym jak wszystkie kulki opuszczą "plac zabaw)
  2. sprawdził, która prosta trafia jakiegoś boota
    a) jeśli jakiś boot zmieni swoją pozycję to trzeba sprawdzić, czy nie wszedł "pod ostrzał"
  3. dla każdej prostej określamy pocisk, który jest najbliższy celu i tylko dla niego sprawdzamy kolizje
    a) najpierw jest to pierwszy pocisk
    b) po trafieniu ten, który trafił jest już nieważny dla nas bo już "zaliczył" cel, ważnym staje się poprzedni

I teraz warjacje

  1. na lini pocisku może być więcej bootów
  2. pocisk przelatuje przez boota i może trafić kolejnego

Generalnie wychodziło by (oprócz dodatkowych obliczeń prostych i po zmianie miejsca przez bota, kierunku strzału) sprawdzeń kolizji tyle, ile botów jest pod ostrzałem

0

no ale boty sie poruszaja, a kazdy ze 128 swiecidelek moze sie poruszac w indywidualną stronę, na animacji jest pokazane to inaczej bo boty sie nie ruszaja i nie giną dlatego też kazdy strzela w ta sama stronę.

Dodatkowo jak swiecidelko juz sie rusza to nie zmieni swojego kierunku lotu

0

to może daj najpierw jakieś założenia

btw czy pojedyńczy bot może wystrzelić tylko 128 kulek, czy też w danej chwili może być widocznych 9czyli w grze) 128 kulek i tak mniej więcej jak oceniasz na ile różnych kierunków te 128 kulek się rozejdzie?

0

moze wystrzelic 128 w byle jakim kierunku moze tez tylko 9 w byle jakim kierunku wystrzelic,
nie kumam co mam zalozyc ale
zalozeniem jest ze boty do siebie strzelaja kazdy ma tablice kulek gdzie wiemy czy dana kullka w tablicy jest widoczna i leci czy nie i teraz dla jednej widocznej kulki sprawdzam czy przypadkiem nie zabija jakiegos bota (42 botów do sprawdzenia) tych kulek widocznych moze byc 9 lub 0 lub 128 lub 11

0

Jest kilka sposobów by ograniczyć ilość sprawdzeń kolizji.
Np. Dzielisz planszę komórki (kawałki przestrzeni). Każdy obiekt należy do co najmniej jednej komórki (jeśli obiekt ma niezerowy rozmiar to leżąc na granicach komórek może należeć do tych sąsiadujących komórek). Obiekt przesuwając się zmienia przynależność do komórek. Każda komórka to w zasadzie lista obiektów, które do niej należą. Teraz sprawdzanie kolizji to sprawdzanie kolizji dla obiektów z jednej komórki.
Rozwiązanie proste i zrozumiałe, a gdy obiekty są bardzo rozrzucone po mapie to jet również bardzo efektywne.

Inne usprawnienie to każdy pocisk pamięta odległości z ostatniego sprawdzenia. W co 10 kroku sprawdzane są wszystkie obiekty (by zaktualizować wiedzę), a w innych przypadkach tylko te w pobliżu. Najlepiej zadbać by dla każdego pocisku ten co 10 krok wypadał w innym momencie.
Jeśli pociski poruszą się po z góry ustalonej trajektorii można to jeszcze bardziej usprawnić. Pociski są szybkie, a boty powolne. Wiec w czasie wystrzelenia można policzyć, które boty mają szansę oberwać i w ten sposób ograniczyć liczbę testów kolizji. I po każdym teście ujmować obiekty z tej listy.

0

te dzielenie na kwadraty jest calkiem sensowne tylko trzeba wymyslec automatyczny system podzialu przestrzeni w zaleznosci od gestosci botow

0
Komorkowy_dzony napisał(a)

tylko trzeba wymyslec automatyczny system podzialu przestrzeni w zaleznosci od gestosci botow
To nie było by dobre. Obszary powinny być maksymalnie małe, aby kolizje były sprawdzane tylko gdy obiekty są blisko siebie. Jednak nie mogą być za małe bo zbyt często obiekty zmieniałyby przynależność. Muszą być też na tyle duże, aby obiekty nie przeskakiwały o więcej niż jeden obszar. I w ten sposób powinien ustabilizować się jeden optymalny rozmiar obszaru.

Aby uniknąć sytuacji, że obiekty są bardzo blisko siebie, ale na różnych obszarach i kolizja nie zostanie wykryta to rozwiązania są 2:

  • obszary nachodzą na siebie (wtedy sprawdzasz tylko jeden obszar, którego środka pocisk jest bliżej)
  • obszary przylegają do siebie (wtedy sprawdzasz obszar w którym znajduje się pocisk oraz obszary przylegające)
0

moj pomysl to usprawnienie pomyslu marka.

w kazdym pocisku mamy kopiec typu min, ktory przechowuje pary wartosci (bot, przyblizony minimalny czas dotarcia do bota). kluczem jest minimalny czas. przy kazdym uaktualnianiu wyciagamy (uaktualniamy) z kopca tylko te boty dla ktorych minimalny czas jest mniejszy lub rowny aktualnemu czasowi. oczywiscie wyrzucamy bota z kopca jezeli stanie sie nieosiagalny dla pocisku. przyblizenie musi byc takie, zeby nigdy nie przekraczalo rzeczywistej wartosci.

ewentualnie mozna to odwrocic i zamiast kopcow botow w kazdym pocisku miec kopiec pociskow w kazdym bocie - to byloby duzo bardziej efektywne tutaj ze wzgledu na to, ze pociskow jest znacznie wiecej.

duzo zalezy jaka jest predkosc pociskow (np w ciagu jednego uaktualnienia czyli np jednej ramki obrazu moga przeleciec pol planszy a moga ulamek procenta planszy) i stosunek predkosci pociskow do predkosci botow (jesli pocisk jest tylko kilka a nie kilkadziesiat razy szybszy niz bot to tez trzeba inaczej zaprojektowac).

0

Można zastosować tablicę mieszającą i umieszczać w niej wszystkie obiekty.
Obiekty potencjalnie kolidujące ze sobą będą umieszczane w tych samych kubełkach (w lekkim uproszczeniu, ale mam nadzieję, że łapiecie sens). Przy założeniu stałego wsp. wypełnienia tablicy < 1, złożoność takiego rozwiązania to O(1) przy liczeniu kolizji i O(1) przy modyfikacji tablicy spowodowanej przesunięciem obiektu. Mając gotową tablicę mieszającą zaimplementowanie tego rozwiązania to kilka linijek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1