Skocz do zawartości

Synchronizacja w 39dll


Jaklub

Rekomendowane odpowiedzi

Co zrobić aby zsynchronizować grę w 39dll? Wszystkie poradniki które znam nie mają żadnych informacji na ten temat.

na czym polega problem.

przypuśćmy, że strzelam do innego gracza. u mnie widać, że pocisk go trafia, ale on go unika. Pocisku już nie ma, ale gracz został niezraniony.

 

Jaka jest najlepsza metoda synchronizacji gry? Mnożenie odległości startowej pocisku od gracza to chyba niezbyt dobry pomysł (zwłaszcza gdy ping jest ogromny).

 

Czy "oczekiwanie" na innych graczy i zwolnienie gry to jedyny sposób?

Odnośnik do komentarza
Udostępnij na innych stronach

Serwer co stepa wysyła swój "czas" czyli 'current_time' do wszystkich klientów, i zapisują ją sobie do jakiejś zmiennej globalnej np. global.server_current_time

Potem gdy klient "strzela" wysyła też zawartość zmiennej server_current_time.

Gdy informacja "odbije się od serwera" i dojdzie do innych klientów, klient porównuje zmienną z czasem strzału którą otrzymał, ze zmienną global.server_current_time po czym oblicza laga :P

czyli np:

 

fire_time - zmienna czasu strzału którą odebraliśmy

global.server_current_time - zmienna czasu serwera

boost - przyśpiesze które musi być wywołane w pocisku aby dorównać lagowi

speed - szybkość pocisku

direction - kierunek pocisku

Teraz tworzmy obiekt przypisując mu zmienną czyli np:

 

GML
pocisk= instance_create(x,y,twojpocisk)

pocisk.boost= (global.server_current_time-fire_time)/60

 

a w pocisku w stepie dajemy dodajemy kodzik:

GML
if boost >0

{

x+=lengthdir_x(boost*speed,direction)

y+=lengthdir_y(boost*speed,direction)

boost=0

}

 

Mam nadzieję że pomogłem :D

Jak by co to wal na gg ;>

Odnośnik do komentarza
Udostępnij na innych stronach

A i powinieneś zrobić jeszcze zrobić dodatkowy obiekt np 'obj_timer' który co stepa będzie dodawał czas do 'global.server_current_time' bo przecież wszędzie sekundy upływają tak samo.

W takim obiekcie daj w create:

GML
delta_time=current_time

a w stepie:

GML
if variable_global_exists('server_current_time')

{

global.server_current_time+= (current_time - delta_time)

delta_time=current_time

}

Odnośnik do komentarza
Udostępnij na innych stronach

Co zrobić aby zsynchronizować grę w 39dll? Wszystkie poradniki które znam nie mają żadnych informacji na ten temat.

na czym polega problem.

przypuśćmy, że strzelam do innego gracza. u mnie widać, że pocisk go trafia, ale on go unika. Pocisku już nie ma, ale gracz został niezraniony.

 

Jaka jest najlepsza metoda synchronizacji gry? Mnożenie odległości startowej pocisku od gracza to chyba niezbyt dobry pomysł (zwłaszcza gdy ping jest ogromny).

 

Czy "oczekiwanie" na innych graczy i zwolnienie gry to jedyny sposób?

najlepiej? kiedy wysyłasz pakiet strzelania do servera, ale nie tworzysz obiektu, wysyłasz tylko dane, no i server śle do wszystkich i do Ciebie też... aha, i najlepiej by było gdyby server też decydował czy pocisk trafił i odebrał hp czy nie.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...