Skocz do zawartości

[39dll]Problemy techniczne


Rekomendowane odpowiedzi

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

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

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

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

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

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