Jak reprezentować pociski w grze wideo?

14

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.)?

Polaris878
źródło
5
Wiele gier FPS zakłada, że ​​pociski są natychmiastowe, ale są takie, które obliczają trajektorie i czas podróży.
John McDonald,
2
+1 to świetne pytanie i niekoniecznie ograniczyłbym to do 3d.
ashes999

Odpowiedzi:

8

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:

struct Ray
{
  Vector3f start, end ;
} ;

Wygląda tak:

wprowadź opis zdjęcia tutaj

(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)

Bobobobo
źródło
1
Promień nie działa zbyt dobrze dla wielu pocisków. Na przykład każdy pocisk, który można lobbować, jak pociski czołgu. Promienie są jednak idealne do pocisków z wystrzałem z dystansu.
MichaelHouse
Dobrze, jeśli powłoka jest bardzo wolno poruszających się (w porównaniu z kulą lub laser), to tak bym Model go jako zwykłego ciała (podobnie jak odtwarzacz)
bobobobo
7
Technicznie promień jest punktem początkowym i kierunkiem. Można to ustalić za pomocą punktu początkowego i innego punktu, ale nie jest to część jego definicji. Z definicji promienie są nieskończone i nie mają punktu końcowego.
Casey Kuball,
1
Masz rację, to, co opisałem, to właściwie odcinek linii , ale większość ludzi nazywa je promieniami, mówiąc o wykrywaniu kolizji.
bobobobo,
3

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.

JPRO
źródło
2

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).

Philipp
źródło