Skocz do zawartości

[39dll]Synchronizacja obiektów


Luksor

Rekomendowane odpowiedzi

Przejdę od razu do rzeczy. Jak w 39dll napisać synchronizację obiektów, czyli:

 

- jeden z graczy wciska przycisk strzału i tworzy objBullet

- gracz wysyła dane, że go stworzył

- serwer odbiera te dane i wysyła je do innych graczy

- inni gracze widzą obiekt

 

Proszę o pomoc jak to wykonać.

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli chodzi Ci ogólnie o połączenie wielu klientów do jednego serwera...?

 

Ja np. tworzę sobie obj_client, w którym są zapisane wszystkie informacje o danym graczu, czyli sock, nick, i inne jakieś tam bajery. (że każdy klient na serwerze ma własny obj_client - są w nim zapisane jego dane)

I obj_server odbiera dane po kolei od każdego clienta, a to, co odbierze, wysyła odpowiednio do każdego, innego klienta... :P

 

Gracz naciskając spację wysyła do servera informację id wiadomości powiedzmy s_bullet_client (to jest stała, dawaj jej jakąś tam wartość naturalną), zawierającą x, y, i direction pocisku

Kiedy serwer odbierze taką informację, wysyła ją po kolei do wszystkich graczy (oprócz tego, który ją wysłał), o id powiedzmy s_bullet_server.

A w cliencie jest kod, który po odebraniu takowej wiadomości tworzy pocisk na odpowiedniej pozycji o odpowiednim kącie.

 

Jak się nad tym głębiej pomyśli, to to jest proste :P

 

PS: Przyjmuję, że wiesz, jak się przesyła dane w 39DLL ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Jak chcesz jak najbardziej dziadowski sposób jaki jest , lecz dzialający ,

W create obiektu objBullet , wyślij:

 

instance_id , x , y, direction , speed.

W serwerze zrób odbiór danych, i przesłanie ich do innych graczy.

 

Możesz zgapić , jak to zrobić patrząc jak gracz przesyła dane do serwera o swojej pozycji i na ten sam wzór zrobić z obiektami.

Odnośnik do komentarza
Udostępnij na innych stronach

<POST SKASOWANY>

 

EDIT: Udało się!!! :D

 

Problem tkwił w tym, że w cliencie tworzył się obiek objBullet, który tworzy też gracz, więc dane znowu zostały wysłane do serwka, a ten do innych graczy a gracze do serwka a serwek... i tak się zapętlało. xD

 

Rozwiązaniem było dodanie objBullet_other ktory nie wysyła danych do serwera, jest jako pocisk innego gracza. Teraz wszystko działa poprawnie.

 

Dziękuję bardzo za pomoc! :thumbsup:

 

 

Ale mam jeszcze 2 pytanka:

 

1. Jak sprawdzić kogoś IP?

2. Jak wyliczyć ping?

Odnośnik do komentarza
Udostępnij na innych stronach

- podziel sobie domyślną ilość klatek na sekundę na milisekundy (np 30/1000) (nie trzeba bo w sumie po co ?)

- Gracz wysyła ping i powiedzmy start_ping = true i startuje timer

- Server odbiera ping i wysyła z powrotem do gracza, gdzie graczowi zmienia się znów na false, timer się stopuje

- podany wynik to ping :)

 

Rozumiesz ? Bo trośke namiesiałem ;P

Odnośnik do komentarza
Udostępnij na innych stronach

- podziel sobie domyślną ilość klatek na sekundę na milisekundy (np 30/1000) (nie trzeba bo w sumie po co ?)

- Gracz wysyła ping i powiedzmy start_ping = true i startuje timer

- Server odbiera ping i wysyła z powrotem do gracza, gdzie graczowi zmienia się znów na false, timer się stopuje

- podany wynik to ping :)

 

Rozumiesz ? Bo trośke namiesiałem ;P

Rozumiem, mam tak samo jak ty. :P Ale dzięki za pomoc. :thumbsup:

Odnośnik do komentarza
Udostępnij na innych stronach

Napisałem że pisałem z małych liter i również tak jak ty (duże IP), źle mnie zrozumiałeś ;p

 

Teraz mam problem z czatem. Teorytycznie powinno być dobrze, ale nie jest.

 

client wysyła do serwera tekst:

GML
clearbuffer();

writebyte(chat);

writestring(objControl.nick+" : "+keyboard_string);

sendmessage(objControl.socket);

 

serwer odbiera dane, wyświetla w oknie serwera i przekazuje do innych

GML
server.chatline[4]=server.chatline[3];

server.chatline[3]=server.chatline[2];

server.chatline[2]=server.chatline[1];

server.chatline[1]=server.chatline[0];

server.chatline[0]=readstring();

clearbuffer();

writebyte(rchat);

writestring(server.chatline[0]);

with(objPlayer)

{

if(id != other.id)

{

sendmessage(socketid);

}

}

 

gracz odbiera i wyświetla dane

GML
objPlayer.chatline[4]=objPlayer.chatline[3];

objPlayer.chatline[3]=objPlayer.chatline[2];

objPlayer.chatline[2]=objPlayer.chatline[1];

objPlayer.chatline[1]=objPlayer.chatline[0];

objPlayer.chatline[0]=readstring();

 

Co jest nie tak?

Wiadomość nie dociera ani do serwera, ani do innych graczy.

Proszę o pomoc.

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