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
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

kryniak (12:17, 16.02.2008)

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

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 "

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

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

ΨΧΞ (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
134 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 130, userów: 4, ukrytych: 0
Fervi , Threef, SimianVirus7, Frankiekib

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
Fervi  (23:55, 25.05.17):
Społeczność jest dużo mniejsza
Fervi  (23:55, 25.05.17):
Powiedzmy, że potencjalnie reddit. Natomiast masz podział na tagi, więc możesz obserować te, które cię interesują
I am Lord (23:27, 25.05.17):
więc żaden reddit z tego
I am Lord (23:27, 25.05.17):
Te wpisy tam to w 95% jakieś pieprzenie o bitcoinach, spsobach na magiczne bogactwo nie ma nic normalnego :/
Fervi  (23:17, 25.05.17):
Oczywiście te 500zł to taka wartość hmm ... lekka. Są osoby, co zarobiły 16k na jednym poście, albo 1.5k w 2 tygodnie. Natomiast założyłem, że po prostu relanie z 500, może 1000zł / msc będzie
Fervi  (19:37, 25.05.17):
Możesz też wymieniać kryptowalutę z jednej na inną (poloniex)
I am Lord (19:28, 25.05.17):
w jaki sposób kryptowalutę się da wymieniać bo ja nie ogarniam
Fervi  (17:32, 25.05.17):
Każda chyba kryptowaluta jest wymianialna na złotówki. Nawet Dogecoin
Fervi  (17:32, 25.05.17):
Doge się nie wybił, a inne i owszem
Wojo (17:29, 25.05.17):
Tak jak np dogecoin
Wojo (17:28, 25.05.17):
Pomijając te moje śmieszne filozofie to rynek kryptowalut jest juz tak rozwinięty że kolejne kryptowaluty się nie wybijaja bo nie maja nic więcej do zaoferowania
Wojo (17:25, 25.05.17):
I to jest chujowa robota i to. Ale w jednej z nich jesteś w stanie odebrać wynagrodzenie
Wojo (17:22, 25.05.17):
A za pomoc przy osobach starszych dostajesz 2000euro (w realnej walucie). Serio smuci mnie to jak niektórzy kombinują jak koń pod górę zamiast najzwyczajniej w świecie zabrać się do roboty
Fervi  (17:18, 25.05.17):
Oczywiście mechanizm jest bardziej skomplikowany, ale to przykład
Fervi  (17:17, 25.05.17):
Dogecoin to po prostu kolejna waluta. I dobrze. Ale to tak jakbyś na stack overflow za pomoc użytkownikowi zamiast + dostał 10 centów (w kryptowalucie)
Fervi  (17:14, 25.05.17):
Akurat nie moja Od Dogecoin stoi o wiele wyżej. Natomiast może sukces osiągnąć z prostego powodu. To w zasadzie portal z walutą.
Wojo (17:12, 25.05.17):
Ale ta twoja waluta jest czymś pokroju dogecoina czyli czymś co sukcesu nie osiągnie
Fervi  (17:11, 25.05.17):
Masz już 4 kryptowaluty, co się wybiły całkiem nieźle (powyżej chyba 100 dolarów), może ciut więcej. Co prawda Steem nie należy do nich, natomiast na razie idzie go zdobyć dużo
Wojo (17:10, 25.05.17):
Dodatkowo bitcoin jest czymś co wcześniej było niespotykane a to jest jedno ze źródeł jego sukcesu
Wojo (17:09, 25.05.17):
Ale bitcoin to przypadek jeden na milion. Szansa że takj projekt wypali jest niewielka
Fervi  (17:08, 25.05.17):
Dlatego ci co weszli w bitcoina są bogaci, a ci co nie rozumieją krzyczą "hurr durr, waluta komputerowa do płacenia za pedofilię"
Fervi  (17:07, 25.05.17):
Wiem, wszystko co nieznane to demoniczne
Wojo (17:06, 25.05.17):
Ktoś tu chyba powoli zaczyna dzielić losy pakło
Fervi  (17:05, 25.05.17):
Potrzebujemy osób co coś potrafią Wojo
Fervi  (17:04, 25.05.17):
No i bardzo dobrze
Wojo (17:04, 25.05.17):
Szkoda czasu na coś takiego
Wojo (17:03, 25.05.17):
W kryptowaluty sie inwestuje jak mają potencjał a nie leci się pod każdą stworzoną.
Fervi  (17:00, 25.05.17):
Oczywiście im więcej Polaków tym lepiej, na początku nic nie znaczą, to po prostu budują społeczność, a potem ich głos zaczyna znaczyć 1 cent, 2 centy itd. i jest nabijanie kabzy
Fervi  (16:56, 25.05.17):
Oczywiście w kryptowalutach, więc jak ogarniasz co nieco to możesz się wybić na tym (jak na BTC) - przynajmniej potencjalnie
Fervi  (16:56, 25.05.17):
Są ludzie co siedzą na reddit i nic nie mają. A tutaj robią to samo i jeszcze im płacą
Fervi  (16:56, 25.05.17):
Czasem 3, czasem 80. Robisz to co robisz teraz a dodatkowo zarabiasz. Wyobraź sobie, że teraz gadamy sobie na GMC, tylko zamiast pustego rzucania sloganów - dostajesz hajs
ediepl (16:55, 25.05.17):
Jeśli uważasz że godzina twojej pracy kosztuje 3zl to spoko
Fervi  (16:52, 25.05.17):
No proszę, a mówią, że pieniądz nie śmierdzi
ediepl (16:51, 25.05.17):
Spoko praca jak się nie szanujesz
Fervi  (16:39, 25.05.17):
Komentujesz, piszesz posty, blabla
Fervi  (16:39, 25.05.17):
I Jasne, że z ulotek zarobisz więcej, tylko tutaj nie wychodzisz z domu. Po prostu robisz to samo co na wielu portalach
Fervi  (16:38, 25.05.17):
Czym blockchain jest zakładam, że wiesz
Fervi  (16:37, 25.05.17):
Na stronie nie ma reklam, to typowy blockchain (nie ma zatem właściciela)
ediepl (14:45, 25.05.17):
Z rozdawania ulotek miał byś lepsze pieniądze
Wojo (12:55, 25.05.17):
Ale i tak niektórzy żyją we własnym świecie w którym Windows jest złem numer jeden
Wojo (12:50, 25.05.17):
Mam na myśli te pseudo doskonałe sposoby którymi nabijacie kabze spryciarzowi
Wojo (12:49, 25.05.17):
Ale fakt faktem znaczna większość sposobów na zarabianie w necie jest poprostu mało opłacalna. No chyba że chcecie sobie dorobić mając te szesnaście lat. Na dłuższą metę śmiesznie jest oglądać dorosłego człowieka który z klikania pół dnia w reklamy dysponuje pieniędzmi pokoju 500zl i jeszcze się rzuca
Wojo (12:46, 25.05.17):
Nawet się o taką pracę nie starałem. Twoja stara zajęła etat
Fervi  (12:26, 25.05.17):
Wiem, że za tańczenie na rurze więcej ci płacą, ale nie każdy ma takie możliwości
Wojo (8:46, 25.05.17):
500zl przy solidnej pracy xD na 500zl to mi się nawet nie chce
Fervi  (22:39, 24.05.17):
Oczywiście nie mówię, by porzucić stare strony, tylko po prostu dołączyć do kolejnej
Fervi  (22:34, 24.05.17):
Oczywiście drugiej pensi na tym nie zbudujecie, ale z 500zł przy solidnej pracy
Fervi  (22:30, 24.05.17):
Moje bitcoiny nie zgadzają się z tobą xD
Wojo (22:13, 24.05.17):
To nie zadziała. Macie moje słowo
Ankieta
» Jakiej wersji GameMakera głównie Używasz?
GameMaker: Studio 2
GameMaker: Studio
GameMaker 8.1 i starsze
Żadnej

GMCLAN to serwis o programie Game Maker i nie tylko.
Copyright © 2002-2017. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!

[ Czas generowania strony: 0.03153 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev