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 -> Kursy GML
Treść artykułu
Podstawy tworzenia gier online z 39dll
autor: Yoda (15.02.08)
Każdy by chciał stworzyć swój mmorpg - w tym tutorialu postaram się wam przybliżyć zasadę działania 39dll oraz przykłady używania najważniejszych funkcji. Na początku chcę zaznaczyć że do zrozumienia treści tego artykułu wymagana jest dość dobra znajomość GML. Tzn. znajomość zwykłych 'zmiennych' nie wystarczy. Potrzebne będą tablice, zasada działania ID oraz podstawy komunikacji serwer - klient.

Działa to w taki sposób - każdy z graczy wysyła dane o sobie na serwer, a ten z kolei rozsyła te dane do innych graczy. Dzięki temu my widzimy co robią inni, a inni widzą co robimy my. A wszystko za pośrednictwem biednego serwera którego łącze siada od ilości fanów naszej gry exp-iących na potworkach. Tak czy siak, zacznijmy od kliku podstawowych funkcji 39dll:

gml:
dllinit(nazwa dlla, ładowanie funkcji socketow, ładowanie funkcji operacji na plikach); //inicjuje dlla

/*
nazwa dlla - ustawiamy na 0 jeżeli chcemy użyć domyślnej "39dll.dll"
ładowanie funkcji socketow - na true jeżeli chcemy je załadować ( raczej chcemy tongue2.gif )
ładowanie funkcji operacji na plikach - na true jeżeli chcemy je załadować ( jeżeli potrzebujemy )
*/



tcpconnect( ip,port,tryb blokowania ); //proba polaczenia

/*
ip - adres ip serwera
port - port serwera
tryb blokowania - domyślnie na true

zwraca id socketa
*/



tcplisten( port, liczba ludzi, tryb blokowania ); //nasluchiwanie na polaczenia ( serwer )

/*
port - port na którym ma oczekiwać połączeń
liczba ludzi - liczba l. którzy mogą się połączyć
tryb blokowania - domyślnie na true

zwraca id socketa lub kod błedu
*/


tcpaccept( socket, tryb blokowania ); //akceptacja polaczenia

/*
socket - socket z którego nadeszło połączenie
tryb blokowania - domyślnie na true

zwraca id nowo utworzonego socketa
*/


closesocket( socket );

/*
zamyka i 'czyści' dany socket
*/


dllfree( );

/*
zwalnia dlla z pamięci
*/


To tyle jeśli chodzi o podłączanie i inicjowanie połączeń. Teraz trochę o przesyłaniu danych i odbieraniu wiadomości. Dane przekazujemy za pomocą kilku prostych funkcji:

gml:
writebyte( wartosc );

/*
wysyła 1 bajt. wartość może być pomiędzy 0 a 255
tej funkcji używamy zazwyczaj jeżeli chcemy wysłać ID wiadomości lub gracza.
*/


writeshort( wartosc );

/*
wysyła 2 bajtową wartość liczbową. może być pomiędzy -32768 a +32767
tej z kolei funkcji uzywamy najczesciej do wysylania zmiennych. Jednak jeśli musimy wsłac zmienną mającą większą wartość możemy użyć np.
*/


writeint( wartosc );

//lub

writedouble( wartosc );

/*
Jezeli natomiast chcemy wysłac łańcuch znaków ( string ) czyli np. imię gracza albo inną wiadomość tekstową, użyjemy:
*/


writestring( string );

/*
Pamiętaj aby przed wysłaniem pakietu danych użyć funkcji:
*/


clearbuffer( );

/*
Ta funkcja czyści bufor,
Aby wysłać nasz pakiet zmiennych czy innych wartości musimy użyć funkcji, odpowiedzialnej za wysłanie wiadomości. Jest to funkcja:
*/


sendmessage( socket );

/*
Wysyła wiadomość do wskazanego przez nas socketa.
zwraca liczbę bajtów w wiadomości
*/


Tak więc przykładowy kod wysyłania danych o naszym graczu na serwer wyglądałby tak:

gml:
clearbuffer( ); //czyscimy bufor
writebyte( NAGLOWEK ); //o tym za chwilę
writebyte ( naszeID ); // ID naszego gracza
writestring ( name ); //zmienna w stringu - imię
writeshort( x ); //pozycja x
writeshort( y ); //pozycja y
wrteshort( life ); //jakaś zmienna - life
sendmessage( serversocket ); //wysyłamy wiadomość


Czym jest NAGLOWEK ? Ano, już tłumaczę - każda wysłana wiadomość musi posiadać swoje ID, aby serwer/klient wiedział co robić po odebraniu danej wiadomości. W tym celu używa się 'nagłówków', czyli jakiejś liczby używanej do rozpoznania naszej wiadomości ( ID ). W tym celu najlepiej używać stałych.

Dobra, wysłaliśmy nasze wiadomości, ale teraz jak je odebrać? Teraz wytłumaczę najważniejsze funkcje potrzebne przy odbieraniu wiadomości:

gml:
receivemessage( socket );

/*
odbiera wiadomość z danego socketa.
zwraca liczbę odebranych bajtów
*/


readbyte( );

/*
czyta jeden bajt ( np. ID wiadomosci )
*/


readshort( );

/*
czyta zmienną short
*/


readstring( );

/*
czyta łańcuch znaków ( string )
*/


readint( );

/*
czyta zmienną int
i tak dalej
*/


Dobra, jak teraz odbieramy wiadomości? Najlepiej oczywiście w stepie.
Trzeba w tym celu utworzyć pętlę i odbierać w niej wiadomości z socketa:

gml:
while ( 1 )
{
wiadomosc = receivemessage( socket ); //odbieramy wiadomośc

if ( wiadomosc <= 0 ) break; //jezeli jest mniejsza bądź równa 0, wyłamujemy się z pętli
_ID = readbyte( ); //odbieramy nagłówek wiadomości

switch ( _ID )
{
case NAGLOWEK: //nagłówek naszej wiadomości
{
playerID = readbyte( ); //czytamy id gracza który przysłał wiadomość

/* teraz należałoby znaleźc ID tego gracza
w naszej, np. tablicy graczy */


for ( i=0; i<liczba_graczy; i+=1 )
{
if ( i == playerID ) //jeżeli aktualny indeks tablicy równa sie odebranemu ID
{
with ( i )
{
/* odbieramy zmienne */

name = readstring( );
x = readshort( );
y = readshort( );
life = readshort( );
}
}
}
break;
}
}
}


Teraz 'gracz' na serwerze odebrał swoje dane. No ale co z innymi graczami? Do nich przecież teraz musimy je wysłać aby oni również zobaczyli zmiany naszego gracza. No więc w 'kliencie' ( tym na serwerze - odpowiedzialnym za danego gracza w grze ) musimy umieścić taki sam kod jak w kliencie tym na którym gramy, czyli musimy wysłać wiadomości, z tą różnicą, że do innych graczy:

gml:
/* zasada identyczna jak przy
wysyłaniu wiadomości z klienta */


clearbuffer( );
writebyte( NAGLOWEK );
writebyte ( naszeID );
writestring ( name );
writeshort( x );
writeshort( y );
wrteshort( life );

with ( objClient )
{
if ( clientID != naszeID ) //jezeli ID tego klienta nie równa sie naszemu
{
sendmessage( playersocket ); //wysyłamy wiadomość
}
}


Teraz należy w kliencie odebrać te wiadomości, a następnie przypisać je obiektowi przedstawiającemu innego gracza. Tak więc w obiekcie odbierającym dane umieszczamy kod podobny jak na serwerze:

gml:
while ( 1 )
{
wiadomosc = receivemessage( socket ); //odbieramy wiadomość

if ( wiadomosc <= 0 ) break; //jeżeli jest mniejsza bądź równa 0, wyłamujemy się z pętli
_ID = readbyte( ); //odbieramy nagłówek wiadomości

switch ( _ID )
{
case NAGLOWEK: //nagłówek naszej wiadomości
{
playerID = readbyte( ); //czytamy id gracza który przysłał wiadomośc

/* teraz należałoby znaleźc ID tego gracza
wśród obiektów przedstawiających innych graczy */


with ( objPlayerOther )
{
if ( jegoID == playerID ) //jeżeli ID tego gracza równa sie temu ID które odebraliśmy
{
/* odbieramy zmienne */

name = readstring( );
x = readshort( );
y = readshort( );
life = readshort( );
}
}
}
break;
}
}
}


Tak to mniej więcej wygląda. Nasz system powinien działać - odbierać zmienne i przekazywać innym graczom. Wydawałoby się że to na razie takie 'nic', ale wierz mi - większość innych rzeczy ( walka, wysyłanie przedmiotów, grafik ) opiera się na tym właśnie co opisałem. Jeżeli to zrozumiesz, nie będziesz miał już problemów.
Trzeba się z tym oswoić i trochę potrenować, ale myślę że ten artykuł ci to ułatwi.
głosów: 12 | ocena: 7.83 oceń zasób | dodał: gnysek
Komentarze
stron: 21

2


av

blackmaul (10:32, 16.02.2008)

> #Bixon:
>> Czemu wszystko z Tymonem ? ;p

Przecież nie z Biksonem!

av

gnysek (10:56, 16.02.2008)

Bo to Tymon wprowadza tutaj większość modyfikacji, chociaż ja też kilka zrobiłem Ale gdzie mi tam do Tymona

av

kryniak (12:17, 16.02.2008)

Weźcie zróbcie zamiast znaczników <div> <pre> bo ciężko się tu rozczytać.

av

Yoda (12:23, 16.02.2008)

Cekol: a co ma przesyłanie plików do tego artu? :o

av

pablo1517 (17:29, 16.02.2008)

I znów kod błędu :/ i skąd potem pisząc taki nubek ma wiedzieć, jaki jest kod błędu. Pisze się "w razie nie powodzenia zwraca -1/pusty string "

av

Kofel (20:49, 16.02.2008)

Chcecie mogę wam zrobić. RZART. gnysek to ja myslałem , że ty lepsiejszy webmastah od Tymcia :>

av

Matthew (11:29, 17.02.2008)

OMG OMG OMG!!! RZart! Jazda do biblioteki i otwieraj słownik ortograficzny!

av

Pentalinio (12:25, 17.02.2008)

Jak zobaczyłem RZART, myślałem, że to jakiś skrót od artykułu .

av

pablo1517 (19:42, 17.02.2008)

A ja myślałem że te RZART to jest jakiś rzart... xD

av

kryniak (20:45, 17.02.2008)

A ja myślę, że taki Tymon przeglądnie co Wy tutaj piszecie i Wam da warny (to nie rzart) .

av

Tymon (21:00, 17.02.2008)

A co mi do tego.

av

PsichiX (21:28, 17.02.2008)

no to ja go wyrecze

stron: 21

2



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

Nie masz konta? Zarejestruj się
Użytkownicy on-line
5 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 4, userów: 1, ukrytych: 0
I am vader
Użytkownicy na czacie discord
I am vader (12:50, 18.08.18):
gratki
Penguin (11:29, 18.08.18):
Gratulacje
exp (22:07, 17.08.18):
gratuluję również, kariera z przyszłością
Chell (15:00, 17.08.18):
dzieki
Wojo (11:37, 17.08.18):
Gratulacje
Chell (7:00, 17.08.18):
jaką stawkę myślicie że mogę wołać ako junior php po miesiącu praktyk i 2 stażu?
Chell (6:59, 17.08.18):
gmclany, zaraz będę kończył staż i zaczynał pracę na pół etatu
gnysek (9:54, 16.08.18):
niewiele, ale jest szybsze.
MaxGaming (3:25, 16.08.18):
Skoro pliki o rozszerzeniu html(przy standardowej konfiguracji serwera) są po prostu wyświetlane, a te z rozszerzeniem php wykonywane to czy użycie pliku html o tym samym kodzie jest szybsze niż pliku php(jeśli w źródle pliku znajduje się oczywiście sam kod hrml)?
Wojo (17:12, 15.08.18):
Exp podglądaj sobie reportaże o chwilowkach i o tym jak ludzie mają problemy z wyjaśnieniem że nie brali żadnego kredytu
exp (15:16, 15.08.18):
max czemu nie mógł udowodnić, nie chcieli sprawdzić jego podpisu? numer dowodu się zgadzał?
exp (15:15, 15.08.18):
no to też może się przydać, bo typ na koncie google miał podane imię i nazwisko i w adresie prawdopodobnie miał datę urodzenia, więc jak ktoś mnie okradnie, to mam podejrzanego. ale wątpię, że prokuratura będzie zainteresowana tym
I am vader (12:27, 15.08.18):
Nie powinno też się mordować ale to nie powstrzymuje ludzi
Wojo (22:26, 14.08.18):
Ale z drugiej strony nie powinno się kogoś okradać mimo wszystko
Sutikku (21:57, 14.08.18):
exp w formie dowodu mógłby pokazać, że nieumyślnie wysłał komuś swoje dane?
MaxGaming (17:37, 14.08.18):
Mój znajomy własnie wpadł w taką chwilówkę i jako że nie potrafił udowdnić że to nie on wziął to musi to spłacać
exp (17:36, 14.08.18):
no jak czytałem o tym, to w takiej sytuacji musisz de facto udowodnić niewinność
Wojo (19:56, 13.08.18):
z tym są różne scenariusze ale i tak powinien ktoś to uregulować bo to jest nienormalne jak mozna czlowiekowi zniszczyc zycie przez bledy mlodosci
exp (19:46, 13.08.18):
zna mój adres zameldowania, a nie zamieszkania, więc wyjebongo. boję się tylko o chwilówki itd. podobno w razie przyjścia komornika łatwo zamknąć sprawę, ale i tak nie chciałbym takich nieprzyjemności
Sutikku (19:29, 13.08.18):
osobiście myślę, że nic Ci nie grozi, ewentualnie pizza co wieczór będzie przyjeżdżać
exp (15:33, 13.08.18):
przez głupią literówkę wysłałem skan pewnego papieru niewłaściwej osobie. robię to regularnie i zrobiłem się trochę nieostrożny
exp (15:31, 13.08.18):
myślicie, że grozi mi coś, jeśli obcy człowiek posiadł prawie wszystkie moje dane osobowe? (ale nie zna mojego numeru dowodu)
gnysek (10:20, 11.08.18):
Dobra zrestartowałem serwer.
gnysek (10:36, 10.08.18):
wynajem!
MaxGaming (0:23, 10.08.18):
chodiz mi bardziej o doświadczenie niż hajs bo pracować wolę na swoim za mniej niż na etacie za więcej ale jednak pierwsza praca po technikum informatycznym od razu w marketingu to fajna sprawa. Tylko jeździć ponad 100km w jedną stronę codziennie pociągiem?
MaxGaming (0:22, 10.08.18):
więc nie mam pojęcia co robić
MaxGaming (0:22, 10.08.18):
wgl to zaproponowano mi prace w dziale marketingu jednej z polskich firm dzięki temu co uczę się na własną rekę, sam dyrektor działu marketingu stwierdził że woli takie osoby niż te świeżo po studiach które na studiach nie nauczą się praktycznie nic co jest na prawdę potrzebne w tej pracy ale... w WWA a ja mam jednak daleko żeby codziennie tam dojedżać
MaxGaming (23:56, 9.08.18):
nie wytłumaczysz że na prawdę rząd nie może stworzyć tych pieniędzy na 500 plus
MaxGaming (23:55, 9.08.18):
Obsługi telefonu dziecko się samo potrafi nauczyć. Teraz spróbuj nauczyć tego moją babcię. Zrozumcie że ludzie są różni. Znam 20 latków których
I am Lord (23:13, 9.08.18):
I nie chodził na żadne dokształcające najęcia
I am Lord (23:13, 9.08.18):
Mój tata pojechał do Norwegii bez języka i się nauczył go w rok już tak że coś tam rozumiał w pracy a przez 3 latach już w miarę płynnie gada
I am Lord (23:11, 9.08.18):
Przebywanie w obcym środowisku dłuższy czas sam w sobie uczy człowieka jezyka
Sutikku (22:46, 9.08.18):
zgadzam się
MaxGaming (22:40, 9.08.18):
Ale język nie jest potrzebny żeby przetrwać widocznie. Odpuścice trochę. Każda rozsądna osoba by się uczyła języka ale nie jest to jakiś przymus. Myślę że to właśnie dzięki temu że takie osoby nie myślą "nie znasz języka, nie próbuj" to przynajmniej nie siedzą na zasiłkach w Polsce tylko na zmywaku w Anglii
Sutikku (22:36, 9.08.18):
o przepraszam za przekleństwa, wydawały się tak adekwatne do treści, ze nie zauważyłem.
Sutikku (22:34, 9.08.18):
a co to za robienie gierek jak wychodzą Ci chujowe i są rakiem gamingu, i co z Ciebie za żołnierz jak chujowo strzelasz? Grunt, że próbują, efekty słabe fakt. Nie uważam, że to dobre i mądre wyjście, nie miałbym strefy komfortu gdybym nie mógł komunikować się w czyimś kraju, ale potrafię takich ludzi zrozumieć. Dziwniejsze jest dla mnie, że będąc tak długo w danym kraju język sam się nie podłapie.
Wojo (21:20, 9.08.18):
najwyraźniej nie jesteś patustem skoro nie potrafisz pojąć tego jak można żyć na krawędzi i bez żadnych zmartwień
I am vader (20:11, 9.08.18):
Ale co to za życie jak się izolujesz i stajesz się rakiem narodu?
Sutikku (17:40, 9.08.18):
potrafią i próbują ;p
Sutikku (17:40, 9.08.18):
słabe porównania, bo za granicę przeważnie jedzie się zarobić i żyć, a skoro oni zarabiają i żyją, to więcej im do szczęścia nie trzeba
I am vader (17:20, 9.08.18):
Jak idziesz na wojnę uczysz się strzelać, bo inaczej zginiesz. Jak chcesz zrobić grę to uczysz się programowania, bo inaczej nie dasz rady. Jak idziesz do szkoły uczysz się tego co Ci każą, bo inaczej jesteś idiotą. Jak wyjeżdżasz za granicę, uczysz się jezyka i kultury, bo inaczej jesteś pasożytem. Proste. Nie potrafisz, nie próbuj.
Wojo (14:32, 9.08.18):
Zazwyczaj są to ludzie, którzy nie lubią gdy narzuca im się jakiekolwiek zasady
exp (13:44, 9.08.18):
max, jeżeli nauczenie się języka kraju, w którym mieszka się na stałe jest dla niektórych niemożliwe ze względu na "strefę komfortu" to już nie wiem, co mam powiedzieć xd
exp (13:43, 9.08.18):
też znam ukraińców, którzy mówią po polsku, niektórzy bardzo dobrze. tak samo, jak wielu polaków w anglii czy niemczech też dobrze zna język miejscowy. nigdzie nie mówiłem, że wszyscy są źli, ale wielu
Wojo (13:15, 9.08.18):
propaganda cały czas istnieje tylko jest bardziej lub mniej intensywna. Aktualnie nie ma żadnej szansy aby dziecko nie było skażone propagandą (no chyba, że mieszka w jaskini)
MaxGaming (12:14, 9.08.18):
nie słuchałem jak ktoś kiedyś na tym forum polecał w każdym nowym telefonie taśmą zaklejać ten czujnik zalania i teraz mam problem XD
MaxGaming (12:09, 9.08.18):
za dużo propagandy już poszło. Trzeba by czekać a nowe pokolenie które nie jest skażone propagandą A o zgrozo propaganda nie ustaje
MaxGaming (12:08, 9.08.18):
W sumie demokracja to jedna wielka pułapka. Co możemy niby zrobić? Chodzić po domach i tłumaczyć ludziom żeby głosować na inne partie? Nie da rady przekonać większości
MaxGaming (12:07, 9.08.18):
sądzą że są sprytni bo wolą PO albo PiS, a to jest jeden ciort
MaxGaming (12:07, 9.08.18):
Ale tak jest w obie strpny. "Wpjna" PO/PiS to pułapka w którą większośc ludzi się łapie
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.0261 sekund ] [ Liczba zapytań MySQL: 13 ]