XxMichałxX Opublikowano 19 Kwietnia 2009 Udostępnij Opublikowano 19 Kwietnia 2009 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 Więcej opcji udostępniania...
OriPL Opublikowano 19 Kwietnia 2009 Udostępnij Opublikowano 19 Kwietnia 2009 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... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 19 Kwietnia 2009 Udostępnij Opublikowano 19 Kwietnia 2009 Clienta jeszcze nie ma to jak ma to sprawdzić? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Nobody Opublikowano 19 Kwietnia 2009 Udostępnij Opublikowano 19 Kwietnia 2009 Pierwsza informacja powinna być bajtem a nie stringiem ( mniejsze obciążenie łącza ). Po game_end(); nie trzeba dawać exit;. Na moje oko tablica z graczami jest złym wyborem. Może lepiej na listach, mapach etc.? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
XxMichałxX Opublikowano 19 Kwietnia 2009 Autor Udostępnij Opublikowano 19 Kwietnia 2009 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 Więcej opcji udostępniania...
Pental Stary Opublikowano 19 Kwietnia 2009 Udostępnij Opublikowano 19 Kwietnia 2009 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 Więcej opcji udostępniania...
XxMichałxX Opublikowano 19 Kwietnia 2009 Autor Udostępnij Opublikowano 19 Kwietnia 2009 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę