Pental Stary Opublikowano 23 Września 2008 Udostępnij Opublikowano 23 Września 2008 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 :( ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 24 Września 2008 Udostępnij Opublikowano 24 Września 2008 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 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Yoda Opublikowano 24 Września 2008 Udostępnij Opublikowano 24 Września 2008 Zmień metodę odbierania danych. na pętlę najlepiej i używaj nagłówków do wysyłania. Zobacz mój art, albo przykład. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 24 Września 2008 Udostępnij Opublikowano 24 Września 2008 Pewnie dlatego, że obiekt klienta stoi na takiej pozycji i się nie porusza. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pental Stary Opublikowano 24 Września 2008 Autor Udostępnij Opublikowano 24 Września 2008 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 :| . Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 24 Września 2008 Udostępnij Opublikowano 24 Września 2008 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 ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pental Stary Opublikowano 24 Września 2008 Autor Udostępnij Opublikowano 24 Września 2008 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... 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ę