Skocz do zawartości

System id, odbieranie i rozsyłanie danych


Rekomendowane odpowiedzi

Zrobiłem w serwerze już taki mały system id rozsyłanie i odbieranie danych, tylko że moge się założyc ze cos robie zle, bez sensu lub nie potrzebnie + nawet nie sprawdzałem kodu czy dziala bo clienta jeszcze nie ma więc piszę tu bo wy sie znacie:

o_host:

Create:

GML
dllinit(0,1,0)

global.port=get_integer('Podaj port do zalozenia serwera:',14378)

global.maxplayers=get_integer('Podaj max graczy:',20)

global.socket=tcplisten(global.port,global.maxplayers,1)

if global.socket<=0

{

show_message('Nie udalo zalozyc sie serwera!')

game_end()

exit;

}

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

{

global.player=-1

}

global.playerobj=0

new=0

tab=0

Step:

GML
new=tcpaccept(global.socket,1)

if new //jezeli ktos doszedl

{

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

{

if global.player=-1

{

tab=i

global.player=new

break;

}

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

{

if global.player!=-1

{

writestring('newplayer')

writebyte(i)

sendmessage(global.player)

}

}

global.playerobj[tab]=instance_create(room_width/2,room_height/2,o_player);

}

for(i=0; i<global.maxplayers; i+=1) //odbieranie danych

{

if global.player!=-1

{

var size=receivemessage(global.player);

if size>0

{

if readstring()='up' global.playerobj.y-=5 //tutaj tylko dalem na gore i dol ze jak nacisnie przycisk to sie up albo down wysyla (zabezpieczenie :P);

else if readstring()='down' global.playerobj.y+=5

}

}

}

for(i=0; i<global.maxplayers; i+=1) //rozsylanie danych

{

if global.player!=-1

{

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

{

if global.player[a]!=-1

{

writestring('possition')

writeshort(global.playerobj[a].x)

writeshort(global.playerobj[a].y)

sendmessage(i)

}

}

}

}

Proszę aby ktoś przeanalizował i powiedział co tu mozna zmienic zeby bylo lepiej i czy w ogole to bedzie dzialac

Odnośnik do komentarza
Udostępnij na innych stronach

wole na tablicy.. ;p

a exit; po to dałem zeby ta tabela sie nie tworzyła jezeli sie nie udalo zalozyc..

 

edit:

Pierwsza informacja powinna być bajtem a nie stringiem

ok thx nie pomyślałem o tym.

 

weź napisz client + serwer włącz i sprawdź jeżeli działa to znaczy ze wszystko dobrze zrobiłeś a jeżeli nie to dopiero pisz...

No dobra napiszę i sprawdze tylko tu napisałem teraz bo chciałem zobaczyć czy jestem na dobrej drodze

Odnośnik do komentarza
Udostępnij na innych stronach

Nobody, lepiej na tablicy, każda funkcja z listy to linijka kodu, a tablica jest bardziej elastyczna. Mazo, zaraz dam ci kod i pokażę, jak ja to widzę :) .

 

(btw. czemu Michała uważano za nooba? dla mnie to on niedługo będzie w "elicie GMClanu" :P )

 

Dobra, ja to widzę tak:

GML
socket = tcpaccept( tcp, true );

 

if ( !socket )

exit;

 

while( true )

{

message = receivemessage( socket );

 

if ( message <= 0 )

break;

 

clearbuffer();

 

caption = readbyte();

 

switch( caption )

{

case 0:

// doszedl gracz

_name = readstring();

_x = readint();

_y = readint();

 

if ( playC < 10 )

{

for( i = 0; i < 10; i += 1; )

{

if ( play[ i ] == -1 )

{

play[ i ] = true;

 

playO[ i ] = instance_create( _x, _y, Client );

playO[ i ].i = i;

playO[ i ].name = _name;

 

playC += 1;

break;

}

}

}

 

clearbuffer();

 

writebyte( 0 );

writebyte( i );

writestring( _name );

writeint( _x );

writeint( _y );

sendmessage( socket );

break;

case 1:

// odszedl jakis gracz

_id = readshort();

 

with( playO[ _id ] )

instance_destroy();

 

playC -= 1;

play[ _id ] = -1;

 

clearbuffer();

 

writebyte( 1 );

writebyte( _id );

sendmessage( "socket" );

break;

}

}

 

Sam dopiero uczę się 39dll, ale już kiedyś do tego zaglądałem i całkiem proste mi się wydaje :P . Pisałem to chwilkę, z pytaniami wal śmiało :) . E, widzę różnicę między twoim Create'em a moim, więc masz:

GML
dllinit( 0, true, false );

 

tcp = tcplisten( 123, 10, true );

 

if ( !tcp )

{

show_message( 'Nie udało się założyć serwera!' );

dllfree();

game_end();

}

 

for( i = 0; i < 10; i += 1; )

{

play[ i ] = -1;

playO[ i ] = -1;

}

 

playC = 0;

Odnośnik do komentarza
Udostępnij na innych stronach

no kod lepszy od mojego i bardziej wydajny ale ja chce mieć wszystko w jednym obiekcie a tu jak sie da wysyłanie i odbieranie to bedzie tylko wtedy jak ktos dochodzi do gry bo jest exit; jak nikt nie dojdzie.. nie wiem. narazie jeszcze ulepsze serwer, zrobie clienta i napisze jaki będzie rezultat

thx pental

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