Skocz do zawartości

Rozsyłanie danych


XxMichałxX

Rekomendowane odpowiedzi

Pracuję nad grą MMO+ mejbi RPG i teraz w serwerze zrobiłem tak:

Create:

GML
global.listen=tcplisten(12345,30,1);

if(global.listen<=0)

{

show_message('Nie mozna utworzyc serwera')

closesocket(global.listen)

game_end()

}

global.currentid=0

global.player=0

global.ilosc=0

Step:

GML
var new;

new=tcpaccept(listen,1)

if new

{

global.ilosc+=1

global.currentid+=1

global.player[global.currentid]=new

}

for(i=0; i<global.ilosc; i+=1)

{

var size,xv,yv;

size=receivemessage(global.player)

xv=readshort()

yv=readshort()

global.player[i,xx]=xv

global.player[i,yy]=yv

}

i teraz mam odbieranie info o pozycji graczów i wsadzanie do tablicy, ale nie moge wykombinować jak zrobić wydajną pętle na rozsyłanie tych danych.. bo to trzeba zrobic chyba pętle w pętli .. nie wiem w głowie mi się kręci jak za duzo nad tym rozmyslam.. jakby ktos podal przyklad takiej pętli bede wdzieczny.. sam nie wymysle mam za maly umysl ;p

Odnośnik do komentarza
Udostępnij na innych stronach

no to co serwer ma sie dowiadywac o kliknieciu przycisku i wtedy zmienic graczowi pozycje?

edit:

dobra juz wykombinowałem.. kod nie wydajny ale raczej bd działać

GML
for(i=0; i<global.ilosc; i+=1)

{

for(a=0; a<global.ilosc; a+=1)

{

if i=a exit;

clearbuffer()

writebyte(4)

writebyte(a)

writeshort(global.player[a,'x'])

writeshort(global.player[a,'y'])

sendmessage(global.player)

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

W ogóle nieczytelnie to robisz...

 

Zrób obj_client reprezentujący każdego gracza (na serwie).

Przechowujesz w nim jako zmienne lokalne takie dane jak hp, exp, itemki czy co tam chcesz.

 

obj_client pobiera od odpowiadającego jemu klienta (tego, którego reprezentuje) wszystkie dane.

I właśnie ten obj_client wysyła do wszystkich innych graczy swoją pozycję, i inne dane.

 

A global.player przechowuje jego id.

 

Jak dla mnie to dużo czytelniejsze i pozytywniej nastawione na dalsze edycje niż Twoja metoda...

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Nie wysyłaj pozycji w każdym stepie! Jak masz 60 FPS, to wtedy 60 razy w ciągu sekundy zostanie wysłana pozycja. Jak pozycja to jest short, to są chyba dwa bajty, zatem w jednym pakiecie masz 4 bajty + nagłowek, w jednej sekundzie masz zatem 4B * 60 = 240B =~ 2 kb (kilobity). Więc jeżeli masz 11 graczy, to do każdego musisz wysłać pozycję pozostałych 10, zatem wysyłasz do 11 graczy po 10 takich pakietów, 11 * 10 * 2kb >= 220kb, tymczasem przeciętna Neostrada ma bodaj 256kb Uploadu (czyli 32 kB) - nie wliczyłem nagłówków TCP, a te też nieco ważą. 10 graczy zapycha zatem serwer i nic wiecej już nie wyślesz.

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