I am vader Opublikowano 1 Stycznia 2010 Udostępnij Opublikowano 1 Stycznia 2010 Jeśli według was to nie jest pytanie początkującego to sobie przewalajcie to gdzie chcecie. Wg mnie to noobowskie pytanie bo ja je zadaje :x. Witam, chciałem zrobić grę multiplayer, używając 39dll. Napisałem w stepie pewien kod, który jednak powoduje drobne problemy. Na jednym z komputerów w trakcie łączenia się z serwerem, bądź kiedy owy komputer jest serwerem i się połączy z nim ktoś-program przestaje odpowiedać i się wyłącza. Na drugim komputerze nie ma owego błędu. Program działa normalnie. Tak szczerze to nawet nie mam pewności że się będą wyswietlać "u tego drugiego" odpowiednie sprity bo jak jeden z komputerów sie crashuje to jest problem. Jedyne co do czego mam pewność to fakt, że to wina tego kodu. Oto on: GML (step) direction_wieza=point_direction(x,y,mouse_x,mouse_y)-90; image_angle=direction-90; if global.host=true { sock = tcpaccept(listen, 1) if(sock) { global.otherplayer[global.num+1] = sock global.num+=1 sock=-1 } } if global.num>0 { /*Wysylanie pakietow z polozeniem i innymi takimi 1-x 2-y 3-direction 4-direction_wieza 5-kolor czolgu*/ clearbuffer() writeshort(x) writeshort(y) writeshort(direction) writeshort(direction_wieza) writeshort(global.kolor) current=1 for(i=0;i<global.num;i+=1) { sendmessage(global.otherplayer[current]) current+=1 } current=1 while(true) { current=1 for(i=1;i<global.num;i+=1) { size = receivemessage(global.otherplayer[current]) current+=1 } if(size < 0)break; if(size == 0) { show_message("Player "+string(current)+" has left the game."); break; } p_x[current]=readshort() p_y[current]=readshort() p_direction[current]=readshort() p_direction_wieza[current]=readshort() p_tank_kolor=readshort() } Słabo sie znam na 39 dll, więc prosiłbym mocno, żeby jakiś lepiej obeznany użytkownik mi pomógł. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Easeful Opublikowano 1 Stycznia 2010 Udostępnij Opublikowano 1 Stycznia 2010 nie wiem co tu może nie grać, ale wyłapałem taki błąd, a raczej nieprawidłowość: GML for(i=0;i<global.num;i+=1) { sendmessage(global.otherplayer[current]) current+=1 } zamień na GML for(i=1;i<=global.num;i+=1) { sendmessage(global.otherplayer[current]) current+=1 } e: i ta druga pętla for tak samo, chodzi o te trzy argumenty w niej zawarte Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZeroXbot Opublikowano 1 Stycznia 2010 Udostępnij Opublikowano 1 Stycznia 2010 Nie znam się na tym, ale to na pewno nie to co napisał Easeful. Te obydwie pętle to jedno i to samo (dopóki nie użyłoby się tego "i" w pętli). Taka rada na przyszłość ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 2 Stycznia 2010 Udostępnij Opublikowano 2 Stycznia 2010 Aha i taka mała rada: Nie wysyłaj pozycji co step! Spowoduje to ogromne lagi!!! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Easeful Opublikowano 2 Stycznia 2010 Udostępnij Opublikowano 2 Stycznia 2010 Dawka83: A niby co ile wysyłać? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 2 Stycznia 2010 Udostępnij Opublikowano 2 Stycznia 2010 Co 8, 10, 15...? Zapytaj gnyska ile razy wysyła w Almorze, ja stawiam na 10. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 2 Stycznia 2010 Udostępnij Opublikowano 2 Stycznia 2010 i uruchamiaj alarm tylko w tedy kiedy gracz się ruszy :P. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 2 Stycznia 2010 Administratorzy Udostępnij Opublikowano 2 Stycznia 2010 Wysyłam 3 - 4 razy na sekundę. Dla łącza to i tak dużo, ale wysyłanie raz na sekundę powoduje już ogromne latencje, więc te 3 razy to takie minimum. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 2 Stycznia 2010 Autor Udostępnij Opublikowano 2 Stycznia 2010 i uruchamiaj alarm tylko w tedy kiedy gracz się ruszy :P . Dla dynamicznej gry pełnej latających nabojów w której co sekunde ktoś się rusza 800 razy i obraca ciagle działem za pomocą myszki by wypatrzeć wroga to zdeczka ciężko zrobić wyłącznie przy ruchu. Wysyłam 3 - 4 razy na sekundę. Dla łącza to i tak dużo, ale wysyłanie raz na sekundę powoduje już ogromne latencje, więc te 3 razy to takie minimum. Ograniczę do 3 razy na sekundę i powiem co mi wyszło w edicie. Edit: Nadal jest problem. Klient moze sie z serwerem połączyć bez problemów, ale kiedy kiedy ktoś się podłącza do serwera, to aplikacja osoby ktora zalozyla się crashuje i nie odpowiada. Ponizej mój step oraz alarm0: GML (step) //direction_wieza=point_direction(x,y,mouse_x,mouse_y)+90 set_turn() image_angle=direction-90; //jesli jestes hostem if global.host=true { sock = tcpaccept(listen, 1);//akceptujesz polaczenie if(sock) //jesli jakiekolwiek zostalo zaakceptowane { global.otherplayer[global.num+1] = sock; //gracz o nowym id ma wartosc socka global.num+=1 //zmiana id sock=-1 //'resetuje' sock zeby nie wykonalo tego warunku n razy. } } if global.num>0 { current=1 while(true) { current=1 for(i=1;i<global.num;i+=1) { size[current] = receivemessage(global.otherplayer[current]) if(size[current] < 0)break; if(size[current] == 0) { show_message("Player "+string(current)+" has left the game."); break; } p_x[current]=readshort() p_y[current]=readshort() p_direction[current]=readshort() p_direction_wieza[current]=readshort() p_tank_kolor=readshort() current+=1 } } Wiem że masa komentarzy ale lubię tak :3. Poza tym wiecie co myślałem pisząc daną linijke czyli gdzie zrobiłem z siebie idotę pisząc coś innego niż to jest :). GML (alarm0) alarm[0]=10 /*Wysylanie pakietow z polozeniem i innymi takimi 1-x 2-y 3-direction 4-direction_wieza 5-kolor czolgu*/ clearbuffer() writeshort(x) writeshort(y) writeshort(direction) writeshort(direction_wieza) writeshort(global.kolor) current=1 for(i=0;i<global.num;i+=1) { sendmessage(global.otherplayer[current]) current+=1 } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Maxpayn Opublikowano 2 Stycznia 2010 Udostępnij Opublikowano 2 Stycznia 2010 GML while(true) { current=1 for(i=1;i<global.num;i+=1) { size[current] = receivemessage(global.otherplayer[current]) if(size[current] < 0)break; ... Gdy nie otrzyma wiadomości to przerywa tylko petle for() a while ciagnie sie dalej i zawiesza gre, a tak w ogole to jak uzywasz petli for to po ci jakies dodatkowe zmienne current Mniej więcej tak to powinno wyglądać: GML if global.num > 0 { for( i = 1; i < global.num; i += 1 ) { while( 1 ) { size = receivemessage( global.otherplayer ); if( size <= 0 ) break; ... } } } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 2 Stycznia 2010 Autor Udostępnij Opublikowano 2 Stycznia 2010 Dzięki wszystko działa, ale gracze siebie nie widzą. Początkowo myślałem wyłącznie o rysowaniu ale wtedy dupsko z kolizjami. To i przy okazji mam nowe pytanie. Jak zrobić żeby był tworzony nowy czołg(o_czolg) gdy ktoś się połączy i by odrazu od momentu połączenia ten czołg miał ten swój kolor(kolor jest pobierany z get_color, więc może byc dowolny)? Odrazu kolejna z tym związana sprawa-jak zrobić by juz ten stworzony obiekt był "rozpoznawany" czyli jak gracz 2 się poruszy i obróci lufę to przypisany mu u mnie czołg zrobił to samo a nie ten który przypisałem 3? 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ę