Skocz do zawartości
Pental Stary

[39dll]PRzesyłanie danych...

Rekomendowane odpowiedzi

Nie mogę tego pojąć. Create obiekt Serwer:

dllinit( 0, true, false );

global.__maxplayer = 20;
global.__tcplisten = tcplisten( 12564, global.__maxplayer, 1 );

if ( global.__tcplisten )
{
    global.__udplisten = udpconnect( 12565, 1 );
    if ( global.__udplisten )
    {
        show_message( 'Udało się połączyć!' );
    }
    else
    {
        closesocket( global.__tcplisten );
        closesocket( global.__udplisten );
        show_message( 'Nie udało się połączyć!' );
        game_end();
        exit;       
    }     
}
else
{
    show_message( 'Nie udało się połączyć!' );
    closesocket( global.__tcplisten );
    dllfree();
    game_end();
}

Step:

receivemessage( global.__tcplisten );   
// odbieramy dane
Client.x = readshort();
Client.y = readshort();

Game End:

closesocket( global.__tcplisten );
closesocket( global.__udplisten );
show_message( 'Serwer wyłączony...' );
game_end();
exit;

Client Create:

dllinit( 0, true, false );

global.__tcpconnect = tcpconnect( "localhost", 12564, 1 );

if ( global.__tcpconnect )
{
    show_message( 'Udało się połączyć!' );  
}
else
{
    show_message( 'Nie udało się połączyć!' );
    closesocket( global.__tcpconnect );
    dllfree();
    game_end();
}

Step:

clearbuffer();
writeshort( x );
writeshort( y );
sendmessage( global.__tcpconnect );

Pobrany x i y z klienta zawsze wynosi 0... dlaczemu :( ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

to ja tak spytam najpierw skad masz ten kod? radze zobaczyc przyklad Yody o nieskomplikowanej grze MMO, jesli w nim nie znajdziesz rozwiazania to wtedy z checia sie zaglebie. ;p

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zmień metodę odbierania danych. na pętlę najlepiej i używaj nagłówków do wysyłania. Zobacz mój art, albo przykład.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Kod napisałem od zera sam, ale chyba wrócę do przerabiania Kirby Online :D . Yoda, ale ja tam niektórych rzeczy kompletnie nie kumam, a nie chcę bez sensu kopiować. Jak zrobić, że jak na kliencie czegoś dotknę to coś się robi na serwie, jak nadawać ID takim obiektom? Ja tego nie kumam!

 

Pablo, a właśnie, że nie, a w debugerze wyświetla 0 :| .

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nikomu się nie chce zagłębiać w twój kod :P

 

Ja jak się uczyłem 39DLL'a to 3 godziny (z przerwami) naprawiałem jeden błąd - że dane w ogóle nie dochodziły z serwera do klienta.

I zdarzył się dosłownie cud. Rano się obudziłem, nie pamiętałem, czy coś mi się śniło, czy nie. Ale miałem w głowie jedno: że wiadomośc powinienem odbierać jednym obiektem, a nie kilkoma. No i taki właśnie okazał się mój błąd...

 

Jedyne, co na pewno jest tandetne, to metoda odbierania danych. To właściwie jedyna rzecz, której się nauczyłem z artykuły Yody - reszta była dla mnie bez sensu :P Ale akurat ja jestem na tyle uparty, że obiecałem sobie, że sam dam radę zrobić z gierki dla 2 graczy gierkę dla nieskończonej ilości graczy. No i, po 3 dniach, dałem radę :P Wbrew pozorom to prostsze, niż się wydaje :) tablica z id instancji gracza (obj_client), a wszystkie dane gracza zapisane jako zmienne w owym obj_client. A index tablicy to, jak to nazwałem, serwer_id - do każdego gracza wysyłam też je - i serwer wysyłając dane każdego gracza dołącza właśnie ten index tablicy - aby jakoś rozróżniać poszczególnych graczy w kliencie. I to w sumie cały sekret :P Wysyłanie danych o już istniejących graczach do nowego graca, informacji o odejściu gracza itp. to już chyba łatwizna :)

 

Hmmm.... zrobię jeszcze rejestrację/logowanie i dam mój eksperymentalny skrypt jako przykład :P

 

I mini-krytyka:

GML
else

{

closesocket( global.__tcplisten ); //Te cztery linie kodu są takie same, jak te niżej - a takie coś nie powinno występować.

closesocket( global.__udplisten ); //Albo daj jakąś zmienną error, albo po prostu sprawdzaj połączenie TCP i UDP za jednym razem.

show_message( 'Nie udało się połączyć!' );

game_end();

exit; //Po cholere ten exit...?

}

}

else

{

show_message( 'Nie udało się połączyć!' );

closesocket( global.__tcplisten );

dllfree();

game_end();

}

 

I praktyczna rada - najpierw "oswój się" z 39DLL przez zrobienie prostego ponga, albo coś. Jak już dasz radę to zrobić, to dodaj se tego wyświetlanie wyniku, chat itp. Jak już będziesz to miał dopiero bierz się za wersję z wieloma graczami ;)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Exit zostanie, nie wiem jak działa funkcja game_end()... nie, nie zrobię tak jak chcesz, jeśli w przyszłości będę chciał, by było coś innego tu a coś innego tu, musiałbym pisać od nowa... A zaczynam od prostej rzeczy... wysyłanie danych z jednego klienta... A kod jest krótki i prosty...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×