Obecnie pracuję nad odgórną strzelanką zombie w czasie rzeczywistym. Piszę to w Javie, używając JBox2D jako mojego silnika fizyki. W tym tygodniu kodowałem sieć i jestem teraz gotowy do synchronizacji fizyki.
Planuję użyć predykcyjnego modelu klient / serwer autorytatywny, w którym klient może się swobodnie poruszać, o ile serwer zaakceptuje go później. Wiąże się to z wysłaniem przez klienta pakietów zawierających dane o ruchu do serwera oraz obliczeniem opóźnienia i ponownym symulowaniem świata ze starszego stanu.
Mój problem polega na tym, że mój obecny silnik fizyki, JBox2D (w zasadzie port Box2D), nie obsługuje cofania świata i najwyraźniej nie jest tak łatwo serializować światowe dane. Mam 2 rozwiązania, mogę albo zmodyfikować / rozszerzyć mój obecny silnik fizyki, albo napisać własny.
Powody, dla których napisałem własny silnik fizyki -
- Mogę usunąć niepotrzebne funkcje. W odgórnej grze potrzebuję tylko mechaniki kolizji i sił manipulacyjnych. Nie dotyczy to grawitacji.
- Mogę lepiej zrozumieć kod i [najprawdopodobniej] łatwiej byłoby zaimplementować funkcje przywracania
Powody rozszerzenia / modyfikacji JBox2D
- Pisanie własnego silnika fizyki wymagałoby dużo pracy, co może być kłopotliwe
- JBox2D ma bardzo wspierającą społeczność, która może mi pomóc z moim twórcą
- JBox2D ma specyficzne optymalizacje, takie jak wykrywanie kolizji, co czyni go użytecznym
- Niektóre prace zostały już wykonane, ale udostępniono niewiele kodu
Jakie są twoje opinie? To moja pierwsza gra i nie jestem profesjonalnym twórcą gier. Jeśli ktoś może podać linki do pracy już wykonanej w tym obszarze (najlepiej używając JBox2D / Box2D / Java).
źródło
strictfp
wszędzie, co poważnie wpłynie na wydajność. W przeciwnym razie serwer i klient mogą nie uzyskać dokładnie takich samych wyników. Poleciłbym zamiast tego użyć stałego punktu.Odpowiedzi:
Wykrywanie kolizji w 2D jest tak cholernie proste, że nie wiem, dlaczego w ogóle zawracasz sobie głowę używaniem silnika fizyki. A ponieważ wszystkie siły manipulacji są proste lub na zakręcie (bez spadania, zmieniania diagnoz itp.) Osobiście nie zastanawiam się, które powinieneś wybrać. Tworzenie własnych jest proste. Kolizja:
uwzględnij 3 możliwe kolizje, które mogą wystąpić w 2 prostokątach:
EDYCJA: Jak skomentowałem, jestem o wiele mniej zaznajomiony z tą sprawą i nie powinienem się konsultować w sprawie kolizji pocisku / pocisku.
Kiedy pracowałem z pociskami w przestrzeni 2D, zastosowałem rodzaj ścieżki, która działała zarówno w linii prostej, jak i zakrzywionej, w której rzuciłem pocisk za pomocą silnika fizyki (którego nie zrobiłem od zera) i użyłem standardowej kolizji.
Przeczytaj o budowaniu tego od zera w komentarzach.
EDYCJA: * Zaufaj mi, * niezależnie od tego, będziesz potrzebować jakiejś formy martwego liczenia w silniku gry, ze względu na pociski i liczbę pocisków, które mogą być na ekranie w danym momencie. ABSOLUTNIE NIE chcesz aktualizować każdej kuli na ekranie dla każdej klatki w podanej lokalizacji. Jest to jednak świetny sposób na spowolnienie gry: D! Powinieneś zawsze aktualizować tylko te rzeczy:
Teraz zaktualizuj dane w silniku zgodnie z tymi danymi, a nie na serwerze dla każdego cholernego pocisku, i wysyłaj dane pakietowe dla każdego pocisku. (Wyobraź sobie, że robisz to z zaledwie 2 karabinami maszynowymi na ekranie! Jezu!)
źródło