Fastbar
Powrót do strony głównej
Trzymaj pliki na gmclan.org!
Game Maker w pytaniach i odpowiedziach!
Polska dokumentacja
Tabela wyników ligi 24
Pobierz GM
Akademia GMCLANu
Kategorie bazy artykułów
Artykuły -> Game Maker
Treść artykułu
Tutoriale 39dll. Tłumaczenie.
autor: 39ster, Mimek (5.07.09)
stron: 2

1

2

W tym artykule nauczę Cie jak używać39dll zrobionego przez 39stera, do tego, aby zrobić swoją własną grę online. Będziemy posługiwać się przykładem PONG, który znajduje się w paczce z 39dll. :)
INICJACJA DLLA
Aby dll funkcjonował należy podczepić jego skrypty do gry :
Otwieramy GMa > Z menu wybieramy Scripts > Import Scripts > Dllscripts.gml z folderu, gdzie znajduje się 39dll z wszystkimi plikami.
Po imporcie skryptów inicjujemy dlla za pomocą kodu:

kod:
dllinit(0, true, false);


Jeśli pierwszy argument jest liczbą zostaje załadowana domyślna nazwa dlla(39dll.dll). Jeśli dll ma inną nazwę(np. socket.dll) należy ją podać właśnie w tym argumencie.
Drugi argument odpowiada za używanie winsock, w tym przypadku jest to konieczne.
Trzeci argument powinien być ustawiony na true jeżeli chcemy używać funkcji związanymi z plikami. W przykładnie dołączonym do 39dll jest ustawiony na false, gdyż nie potrzebujemy tych funkcji.
STAWIANIE SERWERA:
Aby stworzyć grę multiplayer, jedna osoba musi postawić serwer, czyli hostować, a druga osoba musi się pod ten serwer podłączyć.
Jeżeli chcesz dać możliwość postawienia serwera za pomocą tego dlla musisz stworzyć obiekt, który będzie obsługiwał ustawienia serwera i akceptował nowe połączenia. Przejdźmy do praktyki.
     
Tworzymy dwa obiekty, które będą przyciskami, nadajemy im spritea. Jeden przycisk to HOST, drugi CONNECT. Kiedy gracz wybierze HOST jego kod:

kod:
global.master = true; // hostowanie


powinien wyglądać tak jak ten wyżej. Powinniśmy teraz stworzyć nowy room, do którego będzie przenosić, gdy klikniemy HOST. Nazwijmy go rmWaiting. Teraz stwórzmy nowy obiekt: objWait. W CREATE tego obiektu umieszczamy kod:
kod:

listen = tcplisten(14804, 2, true); //nasłuchiwanie
if(listen, <= 0) //jeśli nie udaje się połączyć
{
show_message("Failed to listen on port 14804); //pokaż wiadomość
game_end(); //zakończ grę
}

Kod ten tworzy nowy socket : nasłuchiwanie. Nasłuchuje on przychodzące połączenia na porcie 14804. Numer portu może być taki, jaki sobie wybierzesz, ale my używamy tutaj 14804. Drugi argument oznacza maksymalną możliwą liczbę połączeń na liście. PAMIĘTAJ : TO NIE JEST MAKSYMALNA MOŻLIWA ILOŚĆ GRACZY W GRZE. Jeśli ktoś stara się dołączyć do gry, to zostaje zapisany na listę, wtedy serwer może zaakceptować jego połączenie. Ostatni argument jest na true, bo nie chcemy zamrażać nasłuchiwania, gdy użyjemy skryptu tcpaccept();. SoCket ten zwróci nam numer identyfikacyjny, który będzie większy niż 0, gdy połączenie osiągnie sukces. Jeśli nie uda nam się połączyć zwracamy numer niższy bądź równy 0.
Kolejna linijka kodu sprawdza, czy nasłuchiwanie jest pozytywne, czy nie. Jeśli nie to wtedy wyświetla wiadomość, iż nie udało nam się połączyć z serwerem i kończy grę.

AKCEPTOWANIE POŁĄCZEŃ
Aby zaakceptować nowe połączenia musimy w evencie STEP obiektu objWait dać kod:
kod:
client = tcpaccept(listen, true);
if(client <= 0) exit;
global.otherplayer = client;
room_goto(rmGame);

Pierwsza linijka sprawdza listę oczekujących na połączenie, czyli po prostu czy ktoś nie próbuje podłączyć się do serwera. Jeśli nikt nie stara się podłączyć zwraca liczbę mniejszą niż 1. Ale jeśli ktoś próbuje się połączyć, to tworzy nowy socket i zwraca jego ID. Będzie on używany do komunikacji(wymiana danych) z graczem, który właśnie dołączył do gry.
Drugi argument w tcpaccept oznacza, że nowy socket będzie działał w trybie nieblokującym. Oznacza to, że jeśli będziesz próbował odebrać wiadomość, to nie zamrozi gry, jeśli nie ma żadnej wiadomości do odebrania.
Druga linijka sprawdza czy tcpaaccept() nie ma czasem błędu. Jeśli napotka błąd, to kończy działanie skryptu. Trzecia i czwarta linijka będą wykonane tylko wtedy, gdy tcpaccept() zadziała bezbłędnie. Trzecia linijka ustawia nam nową zmienną globalną global.otherplayer na ID socketu, które zwróciła dunkcja tcpaccept().
Czwarta linijka przenosi nas do roomu z rzeczywistą grą, którego musisz stworzyć.
Łączenie się z serwerem
Jeśli chcesz dołączyć do gry multiplayer, to musisz połączyć się z serwerem. W roomie, w którym masz dwa przyciski, przycisk HOST ma już swój kod, a teraz zajmiemy się przyciskiem CONNECT, w evencie kliknięcia myszką wpisujemy kod :
kod:
global.master = false;
server = tcpConnect("127.0.0.1", 14804, true);
if(server <= 0)
{
show_message( "Unable to connect to server" )
game_end();
}
global.otherplayer = server;
room_goto(rmGame);

Pierwsza linijka ustawia naszą zmienną globalną master na false, dlatego, że nie jesteśmy serwerem. Jesteśmy natomiast klientem łączącym się z serwerem. Druga linijka kodu wykonuje skrypt, dzięki któremu łączymy się z srewerem. Pierwszym argumentem w tcpConnect() jest adres IP serwera, jeżeli testujesz lokalnie(na localhoscie) użyj adresu 127.0.0.1.Drugi argument to numer portu, z którym się łączymy. Trzeci argument oznacza, czy używamy trybu blokującego czy nieblokującego. Ustawiliśmy go na true co oznacza tryb nieblokujący. Tryb ten służy temu, że jeżeli próbujemy odebrać lub wysłać wiadomość, to gra nie zamraża się(nie zwalnia i nie wiesza się) dopóki operacja się nie skończy.
Jeśli tcpConnect połączył się z sukcesem i został zaakceptowany przez serwer, to zmienna Server powinna wynosić tyle ile wynosi numer socketu. Jeżeli zaś wystąpiły błędy, to zwróci liczbę mniejszą niż 1. Kolejna linijka sprawdza właśnie, czy nie ma błędów. Błąd może wystąpić jeśli serwer nie istnieje, bądź nie zaakceptował naszego podłączenia. Jeśli wystąpił błąd to gra nas o tym poinformuje i się samoistnie zakończy. Jeśli zaś udało się pozytywnie połączyć z serwerem, a on nas zaakceptował, to zmienna globalna otherplayer będzie wynosiła tyle ile zmienna Server. Gra rozpocznie się, jeśli przejdziemy do roomu z grą.


Wysyłanie i odbiór wiadomości.
Aby nasza gra działała normalnie, to musimy znać pozycję paletek i piłeczki. Paletki sterowane są przez graczy, a piłeczka przez serwer. Zajmiemy się teraz wysyłaniem i odbiorem wiadomości.
Wysyłanie
Kontrolując paletkę, musisz wysyłać swoją pozycję Y do innego gracza, aby mógł, a raczej jego gra, narysować Twoją paletkę w odpowiednim miejscu. Aby to zrobić umieszczamy kod w eventach naciśnięcia strzałki w górę i w dół.
kod:

clearbuffer();
writebyte(0);
writeshort(y);
sendmessage(global.otherplayer);

Pierwsza linijka czyści bufor wewnętrzny z wszystkich zbędnych informacji. Druga linijka wysyła do buforu bajt, oznaczający ID wiadomości. W naszej grze wiadomość ID=0 będzie oznaczało pozycję Y paletki. Następna linijka wysyła do buforu aktualną pozycję Y, używając konstrukcji short, ponieważ można używać jej do przesyłania każdej liczby od -32000 do +32000. Zajmuje ona dwa bajty. Jeśli użyjemy tylko jednego bajta, by zaprezentować pozycję Y, a ta wyniesie więcej niż 255 to skończy się rozmiar bajtu, a to spowoduje błąd. Ostatnia linijka wysyła wszystkie wiadomości z buforu do innego gracza. W tym przypadku wysyła 3 bajty. Jeden jako ID wiadomości, a dwa jako pozycję Y/
Teraz musimy wysłać pozycję X oraz Y piłeczki do innego gracza, ale tylko jeśli jesteśmy serwerem. Aby to zrobić umieszczamy ten kod w evencie step piłeczki:
kod:

if(!global.master)exit;
clearbuffer();
writebyte(1);
writeshort(x);
writeshort(y);
sendmessage(global.otherplayer);

Pierwsza linijka sprawdza czy jesteśmy serwerem. Jeśli NIE to kod poniżej nie zostanie wykonany.
Ale jeśli jesteśmy serwerem to pierwsza linijka czyści bufor. Teraz wysyła do niego bajta z ID wiadomości, która będzie oznaczała pozycję piłeczki. Jej ID=1. Następnie zostaje wysłana pozycja X za pomocą konstrukcji short. Analogicznie z pozycją Y.
Ostatnia linijka wysyła to wszystko z buforu do gracza.
Odbieranie wiadomości
W paletce kontrolowanej przez przeciwnika, w evencie step umieszczamy kod:
kod:

var size;
while(true)
{
size = receivemessage(global.otherplayer);
if(size < 0) break;
if(size == 0)
{
show_message("The other player left the game");
game_end();
}
messageid = readbyte();
switch(messageid)
{
case 0:
y = readshort();
break;

case 1:
objBall.x = readshort();
objBall.y = readshort();:
break;
}
}

Pierwsza linijka tworzy nieskończoną pętlę while(true). Pierwsza linijka pętli odbiera wszystkie wiadomości od innego gracza i ustawia zmienną size na ilość bajtów odebranych. Druga linijka sprawdza czy aby na pewno odebraliśmy jakieś wiadomości. Jeśli nie to wychodzimy z tej pętli. Trzecia linijka sprawdza czy przeciwnik dalej gra. Jeśli wielkość wiadomości(zmienna size) jest równa 0 to gra nas informuje, że przeciwnik opuścił grę, a ta automatycznie się zamyka.
Jeżeli natomiast odebraliśmy jakąś wiadomość, musimy sprawdzić czego dotyczyła. Możemy użyć do tego skryptów bufora, w którym wszystkie dane się znajdują, po to, aby odebrać dane z wiadomości. Pierwsza część zwraca nam ID wiadomości. Po tym używamy deklaracji switch() aby co oznacza dane ID. Jeśli ID wynosi 0 to wiadomość oznacza pozycję Y przeciwnika. Pamiętaj, że używając konstrukcji short do wysłania jakiejś wiadomości to musimy użyć tej samej konstrukcji do odebrania wiadomości.
Jeżeli ID widomości wynosi 1 to wiemy, że dotyczy ona pozycji Y i X piłeczki. Używamy teraz konstrukcji short, aby odebrać pozycję X, analogicznie z pozycją Y.
CZYSZCZENIE DLLA
Jeśli nie chcesz żadnych nieprzyjemnych błędów, podczas zamykania gry, musisz oczyścić dlla z pamięci. Aby to zrobić tworzymy nowy obiekt i umieszczamy go w każdym roomie. W vencie Game End umieszczamy tylko jedną linijkę kodu :
dllfree();
Oczyści to całego WINSOCKa i pamięć używaną przez bufor wewnętrzny.
stron: 2

1

2

głosów: 7 | ocena: 7.42 oceń zasób | dodał: Mimek
Komentarze
stron: 312

3


av

kt1117 (22:31, 25.01.2011)

Jest jeszcze kilka literówek. Nie przeszkadzają specjalnie, ale są np. dunkcja.

av

Mentoss (6:30, 8.04.2011)

da się jakoś później w TCP wylączyc socketa ?

av

Tymon (11:19, 8.04.2011)

closesocket?

av

Maćko (15:50, 6.07.2012)

Bardzo dobry dll to robienia multiplayerów.

stron: 312

3



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
25 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 24, userów: 1, ukrytych: 0
Ignatus
Użytkownicy na czacie discord
Shoutbox
MaxGaming (0:33, 20.10.18):
chodzi mi jak to z licencją jest, czy nie będę jej łamał
Wojo (22:17, 19.10.18):
zresztą, nie wiem
Wojo (22:16, 19.10.18):
tak
MaxGaming (19:21, 19.10.18):
Czy mogę usunąć w stopce "Zbudowany za pomocą Storefront i WooCommerce."?
Wojo (12:55, 19.10.18):
i cała ta dychotomia społeczeństwa wydaje się śmieszna dla osoby, która ma trochę względnego obycia w różnych środowiskach
Wojo (12:52, 19.10.18):
zresztą, zaprzestańmy tej dywagacji oraz popisu swojej erudycji
Wojo (12:51, 19.10.18):
ja w ogóle nie rozumiem tej protekcjonalnej postawy
ANtY (8:05, 19.10.18):
stalaktyzacja??
MaxGaming (0:08, 19.10.18):
exp stagmatyzacji brania narkotyków podczas zawodów mma? XD
exp (23:32, 18.10.18):
nie wiem dokładnie o czym mówicie ale stygmatyzacji brania narkotyków nie rozumiem i chyba nie zrozumiem
Sutikku (18:21, 18.10.18):
w mojej opinii też był sćpany, pozdrawiam, aż specjalnie sobie obejrzałem te gale bo tak ogólnie to mnie to nie interesowało
Wojo (19:03, 17.10.18):
mam nadzieję, że wiesz co jest pięć
Wojo (18:44, 17.10.18):
Jezu MaxGaming przeczytaj raz jeszcze co napisałem (pierwsze zdanie zaczynające się kluczowymi słowami "W MOIM PRZYPADKU"
MaxGaming (16:30, 17.10.18):
Jezu Wojo przeczytaj raz jeszcze co napisałem(punkt 3).
Wojo (13:55, 17.10.18):
Niemniej jednak wielu ludzi twierdzi w takim momencie, że coś paliłem
Wojo (13:54, 17.10.18):
W moim przypadku czerwone oczy (właściwie to lekko różowe białka) oraz opadające powieki pojawiają się najczęściej zimą gdy wchodzę z zimnego dworu do ciepłego pomieszczenia. Zresztą co ja się będę tłumaczył jak tu każdy wie swoje
MaxGaming (13:41, 17.10.18):
I 1. czerwone oczy nie są po takich środkach tylko po marihuanizacji. 2. Czerwone oczy od kamery są trochę inne niż te po paleniu. 3, Tak, marihuanizacje ciężko rozpoznać bo jest tyle opcji by mieć takie czerwone oczy. 4, nie widzę u niego ani trochę czerwonych oczu. To jeszcze odnośnie wcześniejszej wiadomości
Wojo (13:39, 17.10.18):
xD
MaxGaming (13:36, 17.10.18):
uwierzył że nie był. Pokazywałem to kilku kolegą co dużo ćwiczą i kliku co znają mefedron i jego efekty. Wszyscy to samo stwierdzili co ja.
MaxGaming (13:34, 17.10.18):
Popieram. Tak jak mówię adrenalina nie działa tak na nikogo oprócz niego. Poza tym Wojo za młody jesteś widocznie i za mało zmefedrowanowanych osób widziałeś żeby nie wiedzieć co jest pięć. Uważam że każdy kto trochę miał z tym styczność w ciągu pierwszej minuty wywiadu zorientuje się co jest pięć. Ale ogólnie Wojo od dawna zauważyłem że masz takie dzieciakie, naiwne myślenie. To nie jest sprawa która jest dla mnie jakaś istotna był naćpany to był, to nie moja
Ignatus (13:11, 17.10.18):
Obserwuję od 15 lat MMA i Adbustera od początku.Był w h*j naćpany Nikt się tak nie zachowuje nawet 10 sekund po walce
Wojo (13:02, 17.10.18):
I jak próbujecie sobie i innym wkręcać, że był naćpany to jest godne politowania (żeby nie było, nie bronię go dlatego bo jestem jego fanem, wręcz przeciwnie, irytuje mnie jego osoba)
Wojo (12:57, 17.10.18):
to dlaczego by nie zrobić specjalnej gali dla takich walk?
Wojo (12:57, 17.10.18):
Pomysłów mają dużo, lepsze to niż wpakowanie na oficjalną galę jednej walki aktora z muzykiem. I tak każdy nie będący w temacie ogląda galę dla tej jednej "popularnej" walki. Skoro w telewizji i w internecie trąbi się o wygranej muzyka z aktorem, a większość zwycięstw w tej samej gali pomija
Wojo (12:55, 17.10.18):
Uważajcie jak chcecie. Moim zdaniem taka oficjalna gala freakfightów jest dobra, zawsze coś ciekawego się dzieje. Jednemu wypada szczęka, drugi łamie nogę, trzeci chudzielec bije się z mięśniakiem, walki bliźniaków
ANtY (12:51, 17.10.18):
sorki ale nie bede tego ogladal xd
Ignatus (11:40, 17.10.18):
Obejrzyjcie wywiady ze wszystkimi uczestnikami FAMEMMA po walce, ba ,obejrzyjcie losowe kilkanaście/kilkadziesiąt wywiadów minuta po walce- NIKT NIGDY nie zachowywał się jak AdBuster- nawet oficjalny ćpun Popek .To on jeden na świecie tak reaguje na "emocje" że w niczym nie przypomina siebie na codzień?Nie ma co bronić typa-ewidnentnie się naćpał...
MaxGaming (11:37, 17.10.18):
no znam tą walkę
MaxGaming (11:36, 17.10.18):
To że oni się tak słabo przygotowują to właśnie problem. Z drugiej strony jedną rundę a nie kilka ciosów xd Poza tym mam na myśli takie nastawienie żeby wygrać z kimś zamiast pokonywać swoje słabości. To bardzo nie sportowy sposób myślenia. Jak rozróżniam jedno od drugiego? Jeśli myśli o wygranej z przeciwnikiem kombinujesz jak go przechyrzyć tak na prawdę(dowiedzieć się jakoś jaką ma stategie i treningi, a to wziąć jakąs przedtreningówkę fajną lub zaćpać, a t
Wojo (10:12, 17.10.18):
Zobacz słynną walkę pudziana z najmanem (najman przegrał jak coś), ona nie trwała długo między innymi z tego względu, że to był freakfight
Wojo (10:11, 17.10.18):
wyjaśnienia były 15 października czyli jakoś dwa dni po gali (jeśli się nie mylę), a jeśli chodzi o szybkie walki to trudno się spodziewać półgodzinnych walk jak u zawodowców. To są ludzie trenujący średnio po dwa miesiące i daleko im do zawodowego poziomu
MaxGaming (4:07, 17.10.18):
tylko dwie weszły do drugiej rundy jak dobrze pamiętam
MaxGaming (4:07, 17.10.18):
pomijam już ile trwały walki
MaxGaming (4:06, 17.10.18):
wgl nie ten state of mind zawodników
MaxGaming (4:06, 17.10.18):
dla mnie tam mało było sportu
MaxGaming (4:06, 17.10.18):
A rafon to otwarcie mówił że lubi sterydy tylko ileś tam przed walką musi przestać i po walce znowu ostro sterydy
MaxGaming (4:04, 17.10.18):
Zresztą nas to nie dotyczy to w sumie nie istotne. ale tak czy siak ja jestem w 90% pewien że coś tu mocno nie grało i stawiałbym na jakieś stymukanty/euforyki nowej generacji
MaxGaming (4:02, 17.10.18):
ja ogldałem jeszcze przed walką jakiś wywiad, nie pamiętam ile przed. Ale wysłalem znajomym że on jest na 80% naćpany. Było to widać ale nie tak mocno jak tutaj gdy doszły emocje. A mefedropodbne rcki mają ro do siebie że emocje są przetwarzane trochę inaczej i jeśi są duże to bardzo łatwo komuś kto wie co jest 5 rozpoznać czy ktoś jest porobiony czy nie nawet bez takich rzeczy jak źrenice itp
MaxGaming (4:00, 17.10.18):
można gdybać ale albo gośc ma jakieś mocne zaburzenia psychiczne albo był naćpany, nie chce mi się wierzyć że tak wygląda trzeźwy człowek Mam znajomych którzy trenują sporty walki, widziałem już ich naladowanych po wygranej czy przegranek walce gdy nimi emocje kipiały ale to zupełnie co innego. Podobnie zawodicy fame mma 2. Oprócz niego nikt nie wyglądał na naćpanego a nie jednym emocje mocno targały
MaxGaming (3:59, 17.10.18):
YT nie działa akualnie Wojo ale jeśli to ten filmik gdzie adbuster pokazuje testy zrobione tam chyba 9 czy 10 dni po to już wyjasniłem to wcześniej
MaxGaming (3:58, 17.10.18):
oglądłem najpierw całe wywiady i znim zobaczyłem tą kompilację już w pierwszej minucie wiedziałem co jest pięc
Wojo (10:48, 16.10.18):
www.youtube.com...h?v=XhmsV_IBles tutaj masz jakieś wyjaśnienia
I am Lord (9:18, 16.10.18):
swędzenie ni występuje po przedwakowaniu kofeiny tylko beta alaniny, na niektórych w tym mnie bardzo negatywnie to wpływa
I am Lord (9:17, 16.10.18):
ale ten filmik jest pocięty i moco zmanipulowany, obejrzyj full 5 minutowy wywiad i tam sprawia wrażenie normalnego tylko lekko nabuzowanego i tyle
MaxGaming (1:49, 16.10.18):
Osoby które nie mają doczynienia z mefedronem itp nie mają pojęcia że tu nie chodzi tylko o te jego drapanie po nosie czy oczy. Chodzi nawet o sposób ekspresji emocji. A raczej nadekspresji w taki bardzo nie typowy sposób. Jak to wyjąsnić? No najlepiej obejrzyjcie ten filmik z adbusterem bo to przykład 1:1
MaxGaming (1:47, 16.10.18):
natomiast na 90% mogę stwierdzić że ćpał
MaxGaming (1:46, 16.10.18):
jedno w tym wszystkim jest pewne - prawdy nie da się udowdnić, ani że był trzeźwy ani że ćpał
MaxGaming (1:46, 16.10.18):
mój kolega który nigdy nie brał amfetaminy a palił codziennie trawę na badaniach na mocz miał amferaminę ktorej nigdy w życiu nie brał i thc nie wykryto
MaxGaming (1:45, 16.10.18):
kolejna sprawa to jakość tych testów... miałem kiedyś robione testy na mocz dzień po paleniu trawy. THC ku mojemu zaskoczeniu nie wyszło wcale
MaxGaming (1:45, 16.10.18):
i czy serio oni robili wgl testy na rcki czy tylko narkotyki tradycyjne?
Ankieta
» Jakie kursy najchętniej widziałbyś na stronie ?
GM Studio
GM Studio 2
Godot
Construct

GMCLAN to serwis o programie Game Maker i nie tylko.
[ Polityka prywatności ]
Copyright © 2002-2018. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017-2018 {=|=} fable_inside();

[ Czas generowania strony: 0.02137 sekund ] [ Liczba zapytań MySQL: 13 ]