Nasze strony: gmclan.org gameonly.pl ps-plus.pl gameswithgold.pl n-switch.pl hmt.pl
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) | czas czytania: 20 minut, 33 sekund
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:

koddllinit(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:

kodglobal.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:
kodclient = 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 :
kodglobal.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
1 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 1, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
Shoutbox
UzjelUzjel (20:00, 2.07.22):
Zrobiłem test i działa naprawdę spoko, można wydać coś małego na GXa
gnysekgnysek (19:40, 30.06.22):
Polecam newsa o multiplayerze, fajny przykład jak robić sterowanie w grze w betach GM 2022.6+ (i zapewne w GM 2022.8 już normalnie)
ChellChell (11:14, 29.06.22):
słyszałem już o ludziach biorących kredyty na drugą połówkę, ale o subskrybujących GMa na ich kartę pierwsze słyszę
gnysekgnysek (9:14, 28.06.22):
A nie masz jakiegoś 3D secure czy coś, którego może Stripe nie obsługuje?
IgnatusIgnatus (20:14, 26.06.22):
Hmm coś nie tak z kartą (co dziwne bo są mam na niej inne, działające subskrypcje), na żony zadziałało XD
IgnatusIgnatus (11:41, 26.06.22):
Hmm, Jak mam zapłacić za subskrypcję GM? Polska nie jest obsługiwana? Odrzuca kartę i Gpay..
ThreefThreef (19:08, 25.06.22):
Zmienna keyboard_string zawiera wszystkie klawisze jakie wciśnięto. Możesz ją sobie wyzerować przed wpisywaniem keyboard_string = ""
IgnatusIgnatus (18:03, 25.06.22):
Jak w najprostszy sposób zapisać wpisany z klawiatury tekst jako zmienną którą mogę potem z czymś porównać?
IgnatusIgnatus (21:42, 24.06.22):
Tak. Kwestia jest taka że poza GM nie umiem totalnie nic (a GM używałem 5 lat temu). Może ktoś wie jak się do tego zabrać w GM (w sensie tutoriali lub assetów do kupienia)
ChellChell (17:13, 24.06.22):
podejrzewam że dużo prościej byłoby Ci zrobić to po webowo
ChellChell (17:13, 24.06.22):
hej 👋 dobrze rozumiem że chcesz robić prostą aplikację przeglądarkową w GM?
IgnatusIgnatus (21:39, 23.06.22):
Hello! Mam małą misję. Potrzebuje stworzyć apkę na www która będzie otwierała obrazki po wpisaniu ich dwu-członowej nazwy. To będzie trudne w GM? z 5 lat go nie ruszałem ;p
AdriannAdriann (19:34, 21.06.22):
o, naprawili
gnysekgnysek (16:00, 21.06.22):
Help > Report bug Samo sie nie naprawi Ale dzisiejsza beta ma jakiś fix na Spine.
AdriannAdriann (17:50, 20.06.22):
w sumie nawet nie sprawdzałem gdzie się to zgłasza :o
gnysekgnysek (13:54, 20.06.22):
A zgłoszone?
AdriannAdriann (22:08, 14.06.22):
Ech! Spine dalej nie naprawione :<
HunterHunter (13:36, 8.06.22):
Pytanie do starych wyjadaczy jest jeszcze gdzieś dostępna gra MAGI od TeeGee ?
gnysekgnysek (11:25, 8.06.22):
Ja pamiętam, jak była funkcja draw_image_alpha i po 5-6 grafikach FPS spadał.
expexp (18:27, 7.06.22):
i uruchamiała się jedną sekundę
expexp (18:25, 7.06.22):
łezka w oku się kręci jak wspominam czasy kiedy nowa wersja GM wychodziła raz na x lat i było zero problemów
AdriannAdriann (14:32, 4.06.22):
No i gdzie te aktualizacje:| Popsuli i zostawili
gnysekgnysek (12:24, 30.05.22):
A mogli wydać we wtorek, to jeszcze byłby nadal maj...
gnysekgnysek (12:24, 30.05.22):
Obstawiam, że kolejny raz między ostatnią betą a wydaniem stabilnym dodali "jeszcze dwa małe fixy" i wszystko się sypnęło. Ze spine to jest potwierdzony już błąd.
BorekBorek (20:32, 27.05.22):
Oczywiście jest weekend, także wywalona kiełbasa Jedynie można wrócić do poprzedniej wersji i cieszyć się, że ta wersja akurat nie była wymyagana np. dla nowszych wersji Google API Już raz mnie tak załatwili...
BorekBorek (20:29, 27.05.22):
Ostatnie stable jest bardziej rozwalone niż beta. Większość użytkowników nie może odpalić swoich projektów po wczorajszym stable Kocham GM Dobrze, że nie robiłem aktualizacji...
AdriannAdriann (11:23, 27.05.22):
I postacie ze spine zaczęły dziwnie się zachowywać(nie ruszałem w nich nic poza aktualizacjami na bieżąco) A dziwnie znaczy grafiki na różnych layerach często się nie przełączają mimo że powinny
AdriannAdriann (11:22, 27.05.22):
Mam wrażenie że coś się popsuło po ostatnich aktualizacjach gma Bardzo często nie działa mi room_restart() tj raz odpalę grę i działa raz nie
gnysekgnysek (22:58, 11.05.22):
ale tam 39dll chyba też dział, tylko trzeba było dodać brakujące argumenty z numerem bufora (bo GMS nie umiał już ustawiać niezdefiniowanych zmiennych na 0).
SutikkuSutikku (18:34, 11.05.22):
tfu, gms w ogóle, nie gms2
SutikkuSutikku (18:34, 11.05.22):
jak nauczyłem się korzystać z 39dll, to gms2 wyszedł o i tyle z moich nauk
gnysekgnysek (23:29, 9.05.22):
Pisałem już, że przekompilowałem 39dll do x64 i działa w GMS2 ?
gnysekgnysek (21:28, 28.04.22):
Pusty WP - 30-40mb ramu na 1 request.
ChellChell (14:25, 27.04.22):
narzeczona troche bardziej oblatana w temacie mi powiedziala co tam moge poinstalowac i na co zwrocic uwage zeby to zabezpieczyc, ale wciaz smiech na sali
ChellChell (14:24, 27.04.22):
stawialem ostatnio jeden landing na wp dla klienta (wykonany przez jakiegos zewnetrznego kontraktora), w tydzien jakies boty pozmienialy podstrony
ChellChell (14:23, 27.04.22):
jasne, ze powinni zaorac - najnowszy WP ma "wsparcie beta" dla php 8 (ktory wyszedl poltora roku temu), gdzie 7.4 nie jest aktywnie wspierany od 4 miesiecy.
gnysekgnysek (12:56, 26.04.22):
Wordpressa powinni zaorać. Dziwię się, że nikt nie zrobił lżejszego odpowiednika.
ChellChell (11:01, 25.04.22):
aa, nawet nie zauwazylem ze to bylo 3 dni temu
AdriannAdriann (10:09, 25.04.22):
Dziękuje ale już kolega mi to ogarnął i wszystko śmiga :3
ChellChell (9:59, 25.04.22):
nie jestem na tyle kompetentny zeby sie zdzwaniac i to tlumaczyc, ale jak mi podrzucisz dostepy to moge Ci dzisiaj wieczorem to postawic
AdriannAdriann (15:39, 23.04.22):
O kuwa, na wishliście codziennie wpadało po +-5 a tu dzisiaj walnęło i zrobiło się 82 z 28!
AdriannAdriann (22:01, 22.04.22):
privie *
AdriannAdriann (22:01, 22.04.22):
Tak, właśnie problem że nie mam się do kogo zwrócić a to sporo informacji, najlepiej byłoby na provie
gnysekgnysek (21:59, 22.04.22):
Ciężko pomóc jak napiszesz "nie działa". Coś musi się dziać. Biała strona, domyślna strona .html na serwerze, itp.
AdriannAdriann (18:58, 22.04.22):
To nie za bardzo moja dziedzina i nie wiem czy powinienem zrobić coś jeszcze żeby odpalił się instalator
AdriannAdriann (18:57, 22.04.22):
Wziąłem masterneta z któego już kiedyś korzystałem. Tylko coś mi nie działa, dawno tego nie robiłem i nie wiem co może być nie tak. Zalogowałem się do serwera ftp wg danych które wysłali i wrzuciłem rozpakowane pliki wordpressa ale strona nie działa
ChellChell (16:23, 22.04.22):
cloudways fajne na wordpressa
gnysekgnysek (20:14, 20.04.22):
Jutro o 17:00 będzie stream o przyszłości GMa, nie wrzucam newsa, bo napiszę podsumowanie pod koniec po fakcie
gnysekgnysek (20:13, 20.04.22):
ja polecam dhosting
Ankieta
» Kiedy wyjdzie GameMaker 3.0?
Q1 2022
Q2 2022
Q3 2022
Q4 2022
2023 albo i później

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

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