Tworzę prostą strzelankę, podobną do „Galagi” ,) jako część prezentacji, którą robię. Zastanawiam się, jakich strategii i struktur danych użyliby ludzie do śledzenia pocisków, takich jak lasery wystrzeliwane ze statku kosmicznego. Bardzo prosta implementacja, z której wcześniej korzystałem, polega na przedstawieniu każdego pocisku jako punktu i sprawdzeniu kolizji ze wszystkimi obiektami na scenie.
Wydaje się to jednak kosztowne w dużych scenach z wieloma pociskami; Zastanawiam się, jakie inne typy strategii lub implementacji są używane w przypadku tego typu przypadków użycia. Czego używają gry typu FPS do śledzenia pocisków (pocisków, pocisków czołgów itp.)?
game-design
design-patterns
Polaris878
źródło
źródło
Odpowiedzi:
Do bardzo szybkich pocisków (takich jak lasery lub pociski) możesz użyć Promienia .
Promień ma punkt początkowy i końcowy. (Bardzo minimalna) struktura danych dla promienia to:
Wygląda tak:
(Możesz również buforować wektor kierunku i długość, ale użyłem bardzo prostego defn powyżej).
Jeśli promień jest wiązką laserową, która porusza się z prędkością światła, po prostu utrzymasz promień (zaczynając od dyszy pistoletu i kończąc gdzieś na ścianie) przez kilka klatek. Wszystko, co przecina promień każdej klatki, otrzymuje obrażenia.
Jeśli promień jest wolniejszym pociskiem (na przykład pocisk), odległość, jaką pocisk pokonał w czasie, jest modelowana przez promień. Punkt początkowy to miejsce, w którym promień znajduje się na początku ramki, a punkt końcowy to miejsce, w którym promień będzie po zakończeniu kadru. Wszystko na drodze promienia kuli jest uszkadzane przez kulę.
Promienie można skutecznie zderzyć z kulami, aabbs, wypukłymi kadłubami itp. Sprawdź mój projekt Hullinator , aby zobaczyć działający program (CTRL + kliknij, aby wystrzelić promienie)
źródło
Korzystanie z promienia działa dobrze w przypadku natychmiastowych pocisków, takich jak pociski. W przypadku pocisków o mniejszej prędkości, takich jak typ, którego używasz w swojej grze kosmicznej, sensowne jest po prostu śledzenie ich pozycji w świecie gry, tak jak w przypadku każdego innego bytu. To, co często robię, to podstawowa klasa o nazwie Entity, która zawiera właściwości dowolnego trwałego obiektu gry - pozycji, obrotu, skrzynki kolizji itp. Mój kierowany przez gracza i pociski dziedziczą to, a mój świat gry musi wiedzieć, jak sobie z tym poradzić superklasa, a nie każdy indywidualny typ jednostki.
Aby zwiększyć wydajność, bardzo często utrzymuje się pulę dla obiektów, które często tworzysz i niszczysz. Gdy potrzebujesz nowego pocisku, który wyciągnąłbyś z tej puli, zmodyfikuj nowy pocisk zgodnie z potrzebami i zwróć go z powrotem do puli, gdy wygaśnie.
źródło
Jeśli chcesz zoptymalizować wykrywanie kolizji, możesz przechowywać wszystkie obiekty gry w dwu- lub trójwymiarowym drzewie . Ta struktura danych sprawia, że bardzo wydajne jest pobieranie wszystkich obiektów w określonym obszarze.
Drzewa binarne mają jednak tę wadę, że łatwo ulegają degeneracji, gdy obiekty są dodawane, usuwane i zmieniają swoje pozycje, więc trzeba będzie je automatycznie zrównoważyć .
Kompromisem, który byłby łatwiejszy do wdrożenia, ale nie tak wydajny, byłoby zastosowanie podejścia opartego na porcji. Podziel pole gry na kostki i śledź, które obiekty dotykają każdej kostki. Kiedy sprawdzasz kolizje z obiektem, musisz tylko porównać go z listami obiektów kostek, których dotyka (zamień „kostkę” na „prostokąt” w grze 2d).
źródło