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
Gibki Kaktus
Użytkownicy na czacie discord
Chell (21:14, 11.12.18):
owszem, wykrzacza sie jak jest url bez sciezki po /
Sutikku (20:25, 11.12.18):
tfu, gmclan nie gm
Sutikku (20:25, 11.12.18):
GameMaker ma nową ikonkę teraz jak mam otwartą kartę, czy po prostu nigdy na to nie zwracałem uwagi?
Konrad-GM (16:14, 11.12.18):
ImageMagick?
gnysek (23:14, 10.12.18):
tyle ikonek przerabiać ?
exp (19:10, 10.12.18):
a może dać żółtą obwódkę wokół ikonek
gnysek (17:29, 10.12.18):
poszukam jeszcze jak znaleźć, które aktualny user czytał i wtedy dokończę to, żeby działało jak trzeba
gnysek (17:28, 10.12.18):
ale na forum też przeczytane są szare, a nieprzeczytane kolorowe
Chell (16:37, 10.12.18):
a moze by tak nowosci dac na szaro, a odczytane na kolorowo? teraz tak smutno wyglada
gnysek (14:50, 10.12.18):
Tu masz pobieranie danych: gmclan.org/index.php?plik=227
nowy_user (14:04, 10.12.18):
Hmm., a jak dużo jest z tym roboty? Podejrzewam, że to już raczej wymaga konkretnego skilla... póki co znalazłem coś takiego, wygląda nieźle, korzystał ktoś? : marketplace.yoy...unt-online-data
gnysek (13:49, 10.12.18):
Ja robiłem, za pomocą zapytań normalnych z GMa (http_request albo coś takiego) + PHP na serwerze.
nowy_user (13:32, 10.12.18):
Hej, czy ktoś z was kiedyś robił prosty system logowania i rejestracji w GMie? Tak aby konto zapisywało się na serwerze, i aby admin mógł w razie czego zablokować dostęp.Polecacie jakiś dobry extention ( może być płatny) , żeby nie wynajdować koła od nowa?
exp (23:59, 9.12.18):
teraz spoko wygląda
MaxGaming (23:28, 9.12.18):
To już dużo lepsze! Chociaż nadal wygląda trochę jakby to był bug a nie feature
gnysek (22:33, 9.12.18):
ok, to zostawię wersję pierwszą jaką miałem - zmniejszenie przeźroczystości. Będą lekko jaśniejsze ikonki.
MaxGaming (22:24, 9.12.18):
ale nie wszystko na szaro(bo najczęściej większość tematów jest szara przez mały ruch)
MaxGaming (22:24, 9.12.18):
lepiej już oznaczyć wykrzyknikiem małym te nowe, albo coś
MaxGaming (22:23, 9.12.18):
Według mnie to glupio działa. Nagle wszystko jest szare jakby się zepsuło
gnysek (17:26, 9.12.18):
Od teraz posty napisane przed waszą ostatnią wizytą dostaną szarka ikonkę na stronie głównej - łatwiej znaleźć nowy kontent
MaxGaming (17:22, 9.12.18):
po prostu rób coś, zdobywaj doświadczenie i czytaj na jakiś temat żeby się rozwijać
exp (16:43, 9.12.18):
kurczę chciałbym się znać na czymś tak jak ty na gamedevie
exp (16:42, 9.12.18):
aha, więc to o to chodzi
gnysek (13:51, 9.12.18):
prawdopodobnie po to, żeby Steam VAT odprowadzał w stanach, w których trzeba, w Twoim imieniu.
gnysek (13:51, 9.12.18):
bo teraz 100$ wystarczy, tylko z polskiego punktu widzenia musisz zgłosić firmę do podatku (zerowego), w USA (telefonicznie), żeby dostać ichni NIP.
exp (13:40, 9.12.18):
właśnie też wyczytałem to w regulaminie, no ale coś mi tu nie pasuje. ludzie ciągle wrzucają na steama takie gówienka, że nie wierzę, że oni się tak wysilali
gnysek (13:24, 9.12.18):
musiałbyś założyć firmę, zawrzeć umowę ze steam itd.
Temporal (9:52, 8.12.18):
ambicje zawsze nas gubią
exp (22:52, 7.12.18):
w sensie 99 dolarów
exp (22:50, 7.12.18):
tak z ciekawości, jakbym chciał sprzedawać swoją grę, np. na steamie, to po prostu wystarczy zrobić upgrade do wersji "developer" za cztery stówki?
exp (14:37, 7.12.18):
ale mój poprzedni koncept był całkiem fajny i chyba oryginalny. było to tak jakby połączenie spelunky i contry, choć nie do końca
exp (14:36, 7.12.18):
znów naszła mnie ochota na zrobienie gierki i dobrze wiem, że skończy się tak, że mój prosty pomysł się rozrośnie i nigdy jej nie skończę
MaxGaming (23:53, 6.12.18):
co tam u was mordeczki
MaxGaming (3:01, 5.12.18):
też o tym myślałem, lub po prostu ograniczenie np maks 4 strzał i trzeba wytwarzaćnowe
gnysek (23:04, 4.12.18):
Dzida/oszczep. Można rzucać i ma jakaś tam wytrzymałośc, nie trzeba naboi, w razie czego można wytwarzać nową.
exp (19:16, 4.12.18):
może zastawianie pułapek
MaxGaming (17:45, 4.12.18):
U mnie to działa trochę inaczej. Ciężko ranne zwierze przyśpiesza i albo ucieka albo podejmuje walkę i wtedy szarżuje w naszym kierunku
MaxGaming (17:41, 4.12.18):
np łuk, tylko trzeba to tak zrobić aby taki łuk nadawał się jedynie do absolutnie podstawowych celów
MaxGaming (17:41, 4.12.18):
ze trzeba coś zrobić jako taką broń powszednią która akurat będzie miała sporo naboi i łatwo je będzie zdobyć
MaxGaming (17:40, 4.12.18):
hmm, ciekawy system, ale na razie chodzi mi
gnysek (17:37, 4.12.18):
wtedy można mieć mało naboi i ryzykujesz, albo strzelasz 2/3 razy i zgon od razu, albo czekasz aż padnie
gnysek (17:36, 4.12.18):
duże powinny krwawić, jednym strzałem = czekasz 5 minut na śmierć, albo strzelasz dalej
MaxGaming (17:35, 4.12.18):
a chodzi mi o stworzenie bardzo realnego respectu dla dużych zwierząt, chcę żeby polowanie na coś dużego było dla gracza czymś wyjątkowym i odświętnym, kiedy znajdzie jakąś amunicję do fajniejszej broni
MaxGaming (17:34, 4.12.18):
Co nie jest takie proste, bo strzelanie z łuku 3 razy żeby zabić zająca to na przykłąd pomyłka i byłoby bardzo śmiesznie. Zabicie zająca za jendym strzałem = obrażeniom na tyle dużym że na upartego upolowałoby się i dużo większe zwierzęta
MaxGaming (17:34, 4.12.18):
coś takiego żeby nie dało się z tego za wiele zrobić, ale żeby wystarczyło na polowanie na najprostrze zwierzęta pokorju zająca żeby zdobyć pożywienie
MaxGaming (17:33, 4.12.18):
a same pociski będą na wagę złota. Tylko muszę wymyślić jak w to wszystko wpleść uzbrojenie inne niż broń palna
MaxGaming (17:33, 4.12.18):
broń krótka na prawdę nie za bardzo nadaję się do polowania ze względu na swój bardzo mały zasięg i celność, broń pokroju kar98k dla gracza który według fabuły nie za bardzo miał wcześniej kontakt z militariami nie jest szybka do przeładowania i chociaż ma duży zasięg i potrafi powalać z nóg na prawdę szybko to jednak jeden pochopny strzał i zanim przeładujemy to możemy być już martwi
MaxGaming (17:31, 4.12.18):
ale jednoczęśnie funkcjonalna. Unikam realizmu na siłę który by komplikował rozgrywkę i zmieniał ją w niezrozumiałą, a staram się to nadrobić po prostu realizmem w postaci ograniczeń które nałożone są na nas
MaxGaming (17:30, 4.12.18):
jak wspominałem już moja gra ma być jak najprostrza zarówno dla gracza jak i dla mnie w rozwijaniu
MaxGaming (17:30, 4.12.18):
a w grze otwartego świata wcale być nie miało, dopiero w trakcie tworzenia doszedłem do wniosku że można to łatwo i fajnie zrobić i jednoocześnie uniknąc problemów typu "mam misje fabularną 10tyś pikseli ode mnie"
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.02287 sekund ] [ Liczba zapytań MySQL: 13 ]