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
2 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 1, userów: 1, ukrytych: 0
MaxGaming
Użytkownicy na czacie discord
MaxGaming (14:14, 24.06.18):
Jedyne co mogłem zrobić to poprosić go o anulowanie na co nie odpisał
MaxGaming (14:14, 24.06.18):
Innym razem zaznaczyłem że gra w języku angielskim, dodatkowo była to gra Steam i gościu kupując mógł też spojrzeć na stream co jest napisane o języku. Dostałem negatyw bo gra nie zawiera języka polskiego
MaxGaming (14:13, 24.06.18):
I za to powiecinir dostałem 3 gwiazdki za czas wysyłki]
MaxGaming (14:12, 24.06.18):
Podczas sylwestrowej domówki u mojej uwczesnej dziewczyny usiadłem do kompa żeby mu to wysłać mimo że był sylwester i przed drugą transakcja została sfinalizowana
MaxGaming (14:12, 24.06.18):
Ja sprzedawałem kiedyś treści cyfrowe i to miałem napisane 24h robocze (wtedy takie rzeczy wpisywało się w opisie). Gościu kupił u mnie coś w sylwestra o po 23 to była sobota. Wysłał do 1 w nocy trzy e-maile kiedy wyśle
exp (0:34, 24.06.18):
polska jest zacofana m.in. właśnie przez takie myślenie. jakiś janusz cię oszukał, a ty się wahasz, czy wystawić negatywa xd
exp (0:32, 24.06.18):
jak miały być 24 godziny, a minęły trzy dni to dawaj najniższą ocenę
I am vader (22:26, 23.06.18):
A dobra, przeoczyłem.
Wojo (21:24, 23.06.18):
MaxGaming (17:06, 23.06.2018) Tak, napisał o 24h a minęły trzy dni robocze
I am vader (21:18, 23.06.18):
Max Wcale nie potwierdzil ze tak bylo napisane, wiec rownie dobrze moglo tam nie byc
Wojo (20:43, 23.06.18):
no jak koleś napisał na aukcji wysyłka wciągu 24 godzin a spóźnia się 3 dni to jednak jest problem
I am vader (19:20, 23.06.18):
Ludzie nie czytaja jaki jest przewidywany czas wysylki a potem marudza, debile po prostu
I am vader (19:20, 23.06.18):
Pracuje w sklepie internetowym i mielismy takie kawaly skurczybykow ktore dawaly negatywa za wyslanie po 2 dniach.
Wojo (19:01, 23.06.18):
zawsze to twoja subiektywna ocena
MaxGaming (18:24, 23.06.18):
negatyw na pewno nie xd
Wojo (18:24, 23.06.18):
i daj też negatywa żeby kupujący zobaczyli
Wojo (18:23, 23.06.18):
dawaj jedną a nie się pierdzielisz.. Typek trzykrotnie przekroczył termin wysyłki. Po miesiącu jakby ci wysyłał to zgłaszasz sprawę na allegro albo policji i żądasz zwrotu pieniędzy
MaxGaming (18:15, 23.06.18):
No właśnie ja się nie orientuje ile gwiazdek za co dawać. Wydaję mi się że 1 gwiazdka to jakby wysłał po miesiącu xd
Wojo (18:13, 23.06.18):
no to daj jedną a nie trzy... za coś takiego daje się negatywa
MaxGaming (17:23, 23.06.18):
Tak myślę właśnie że dam jakieś 3 gwizadki za czas realizacji
gnysek (17:16, 23.06.18):
ocenę daj niską xD
MaxGaming (17:06, 23.06.18):
Tak, napisał o 24h a minęły trzy dni robocze
gnysek (15:42, 23.06.18):
ale na aukcji pisał, ze wysyłka w 24h ? bo od dawna można taki parametr dawać. no i dni robocze wliczasz.
MaxGaming (15:13, 23.06.18):
Kupiłem klocki hamulcowe na allegro do swojej CBR i trzy doby mineły od zaksięgowania wpłaty do wysłania przez sprzedającego paczki. Jak ja nienawidzę polskiej mentalności mechaników i budowlańców. Wszystko na odpier.... Prawie nigdy żadna część do motocykla zamawiana przeze mnie nie zostaje wysłana jak przystało na współczesne standardy w 24h
Wojo (19:16, 22.06.18):
A gothic 17 lat temu... Jest prawie tak samo stary jak gmclan
MaxGaming (23:11, 21.06.18):
okej restart pomógł xd
MaxGaming (22:50, 21.06.18):
Jak otworzyć ten Splash Screen w android studio? Ten co wyskauje od razu po instalacji?
MaxGaming (22:49, 21.06.18):
a VC 16 lat temu
MaxGaming (22:46, 21.06.18):
ej co jeśli zainstalowałem andoid studio i studio64.exe nie chce się otworzuć? Po prostu nic się nie dzieje chociaż w procesach jest uruchomione
Wojo (21:41, 21.06.18):
A GTA 5 5 lat temu
Wojo (21:40, 21.06.18):
GTA 4 wyszło 10 lat temu
exp (20:45, 21.06.18):
a vice city to według mnie słaba gra. chociaż spędziłem z nią mnóstwo czasu
exp (20:44, 21.06.18):
nie byłem nigdy wielkim fanem tej serii, według mnie najlepsze było gta4
MaxGaming (19:37, 21.06.18):
SA znowu ceniłem za ten klimat, Nie rozumiem czemu gangsterzy mająbyć biali przecież wiadomo że nie było nigdy prawdziwego gangu białych tylko mafie i innego typu grupy przestępcze. Ta historia o wydostawaniu się z getto idealnie zgrała się z modą na gangsta rap
MaxGaming (19:36, 21.06.18):
Wydaje mi się że VC i IV to inny profil po prostu niż SA i V
MaxGaming (19:36, 21.06.18):
nie podoba mi się na nowo uproszczenie GTA i wszystkiego co z nim związane w GTA V. Za to dostajemy ogromną mapę i dużo funkcji które w sumie nie koniecznie są ciekawe typoow dla gry ale już dla zabawy poza fabularnej takq
MaxGaming (19:35, 21.06.18):
No i fabuła była genialna. GTA IV to gra która pod względem fabuły, postaci i ogólnie wykreowanego świata jest w mojej osobistej topce jeśli chodzi o gry w które kiedykolwiek zagrałem
MaxGaming (19:34, 21.06.18):
w GTA IV wyrzucono zbędne funkcje z SA które były błędem. Dodatkowo to miasto, ten NY na prawdę żył! To było coś pięknego
MaxGaming (19:34, 21.06.18):
GTA VC i 4 to kompletne gry, które mniej stawiająna sandboc a bardziej na grywalność
MaxGaming (19:33, 21.06.18):
GTA SA i V to gry żeby pobawić się, mało kto gra w to dla fabuły
MaxGaming (19:33, 21.06.18):
Natomiast GTA IV moim zdaniem jest najbardziej udaną grą z serii i szkoda że GTA V zboczyło z tego kursu
MaxGaming (19:33, 21.06.18):
fabuła, to jak ona wpływała na otoczenie(nie tak na siłę jak w SA) no i te dodatkowe funkcje były super. Na przykład każdego wieczoru zależnie od dnia tygodnia na stadionie można było wziąć udział w różnych zawodach. Kupowanie tych biznesów i zarabianie na nich. No i zdobywanie dzięki temu terenów. I ta fabuła była krótka ale dzięki temu genialna. Zdobywanie willi na przykład to jest coś fajnego. Ogólnie misji było mniej ale były ciekawsze i było mniej zapychaczy
MaxGaming (19:31, 21.06.18):
Ten klimat jest genialny. Do dziś często pykam w VC
MaxGaming (19:31, 21.06.18):
Mówiąc o VC to uargumentuje. Po pierwsze SA było za duże jakby. Mam na myśli że było niezorganizowane, dodano mnóstwo funkcji w ogóle nie związanych ze sobą. I tak trzeba było non stop dbać o siłkę itp żeby nie spadła forma. Ogólnie SA fabularnie jest zajebiste i kliamtycznie ale trochę twórcy za dużo nawtykali takich bezsensownych funkcji. GTA VC podobało mi się bo było bardziej kompletne. Wszystko do siebie pasowało. Brakowało paru funkcji żeby było jak na swoje cza
I am vader (19:30, 21.06.18):
A jesli ktos powie ze midzy gta V a IV jest za duzy okres czasu zeby je nazwac "w tym samym czasie" to moze miec racje, ale tego samego argumentu nie mozna uzyc do sa i vc bo wyszly z 2-letnia roznica
I am vader (19:10, 21.06.18):
bo gta V jest dziesiatki razy wieksze od SA, ale kazdy jest tworem swoich czasow i moim zdaniem w swoim czasie SA bylo milion razy lepsze od VC, a GTA V od GTA IV.
I am vader (19:10, 21.06.18):
GTA:SA natomaist to wooo, śmiem twierdzić że GTA:SA = GTA V > GTA 4 > GTA III=GTA VC
I am vader (19:09, 21.06.18):
Nie rozumiem fendomenu gta 4 i VC. VC chyba jedzie na samej nostalgi bo wiele w tej grze nie bylo, nawet fabula byla krotka.
MaxGaming (19:00, 21.06.18):
Według mnie najlepsze 3 części serii to kolejno GTA 4>GTA VC>GTA SA
Wojo (18:38, 21.06.18):
nieźle się typeczek postarał
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.04178 sekund ] [ Liczba zapytań MySQL: 13 ]