2011-01-18 32 views
5

Zajmuję się wieloosobowej gry fabularnej (Nie, nie jest to MMORPG;).Smooth MultiPlayer ruch

Moja obecna konfiguracja jest w takim stanie.

Klient mówi serwerowi "Chcę iść do przodu"/"Chcę się cofnąć", serwer aktualizuje następnie Twój podmiot i informuje wszystkich klientów w okolicy o zmianie. Serwer aktualizuje również każdą jednostkę co 20ms i wysyła aktualizacje co 100ms do klientów, aktualizacje te zawierają pozycję, prędkość, obrót itp.

Jak dotąd tak dobrze, jednak nie mam nic w zanadrzu do wygładzenia ruchu między pakietami po stronie klienta, i muszę powiedzieć, że nie mogę go uruchomić. Czytałem o przewidywaniu, interpolacji, martwym odrobieniu, ale wszystko to było dla mnie wielkim bałaganem.

W tej chwili robię coś w rodzaju "Position = Packet.Position", co powoduje bardzo ruchy jąkania.

Potrzebuję pomocy, jak uzyskać bardziej płynny ruch? Przyglądałem się próbce predykcji XNA, ale nie mogłem tego naprawić.

Dzięki // F

+0

Czy chcesz, aby ruch gracza był płynniejszy, czy też inne przedmioty? Czy klient zna aktualną prędkość gracza? – ssmir

+0

Cóż, obecnie mam tylko gracza, więc to jest mój główny problem. Klient wie o prędkości, jest zawarty w status-package z serwera. Właściwie to mam fajną odpowiedź na IRC, spróbuję jutro i jeśli jej się uda, to się podzielę. –

Odpowiedz

3

Sugeruję pomysł z another question (patrz odpowiedź zaakceptowane)

Tutaj klient sam oblicza swoją pozycję, tak jakby jej nie gry sieciowej. Klient regularnie wysyła swoją aktualną pozycję na serwer. A jeśli klient oszukuje lub nie może kontynuować ruchu w wybranym kierunku, serwer po prostu wysyła klientowi swoją właściwą pozycję.

Ten sam algorytm był stosowany w Ultima Online (przynajmniej kiedy grałem go 10 lat temu)

+0

To zabawne, jak wspominasz Ultima Online, jest to jedna z moich ulubionych gier. :) Jeśli znajdę problemy z moją obecną implementacją, spróbuję tego. Czy jednak ten wynik nie różni się znacząco od tego, co widzi gracz A i gracz B? –

+0

@Fredrik Yep, jeden z moich ulubionych też =) W rzeczywistości różnica będzie zależeć od pingów graczy i może zostać oszacowana. Ale nie sądzę, że różnica odgrywa tutaj jakąś rolę, ponieważ np. kiedy atakujesz kogoś w UO, klient wysyła identyfikator atakowanego obiektu. Tak więc pewna różnica w pozycjach może być zauważalna tylko wtedy, gdy umieścisz dwa monitory blisko siebie i porównasz. Problemy powinny zacząć się pojawiać po uruchomieniu gry przez Internet zamiast LAN. Zwłaszcza jeśli używasz TCP, ponieważ każda utrata pakietu powoduje ogromne opóźnienie mierzone w sekundach (przynajmniej). – ssmir

0

I rozwiązać go uruchamiając jednostkę ducha wraz z moim głównego.
Duch będzie aktualizowany również w każdej klatce, ale gdy tylko pojawi się pakiet, jego wartości zostaną ustawione na wartości pakietu.

Następnie stopniowo dostosowuję rzeczywistą istotę do miejsca, w którym znajduje się duch.

+0

, więc nadal masz opóźnienie między momentem, w którym gracz inicjuje ruch, a chwilą, w której duch otrzymuje nową pozycję? – ssmir

+0

Tak, jednak nie jest to zauważalne. –