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: 5, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
Wojo (10:48, 16.10.18):
www.youtube.com...h?v=XhmsV_IBles tutaj masz jakieś wyjaśnienia
I am Lord (9:18, 16.10.18):
swędzenie ni występuje po przedwakowaniu kofeiny tylko beta alaniny, na niektórych w tym mnie bardzo negatywnie to wpływa
I am Lord (9:17, 16.10.18):
ale ten filmik jest pocięty i moco zmanipulowany, obejrzyj full 5 minutowy wywiad i tam sprawia wrażenie normalnego tylko lekko nabuzowanego i tyle
MaxGaming (1:49, 16.10.18):
Osoby które nie mają doczynienia z mefedronem itp nie mają pojęcia że tu nie chodzi tylko o te jego drapanie po nosie czy oczy. Chodzi nawet o sposób ekspresji emocji. A raczej nadekspresji w taki bardzo nie typowy sposób. Jak to wyjąsnić? No najlepiej obejrzyjcie ten filmik z adbusterem bo to przykład 1:1
MaxGaming (1:47, 16.10.18):
natomiast na 90% mogę stwierdzić że ćpał
MaxGaming (1:46, 16.10.18):
jedno w tym wszystkim jest pewne - prawdy nie da się udowdnić, ani że był trzeźwy ani że ćpał
MaxGaming (1:46, 16.10.18):
mój kolega który nigdy nie brał amfetaminy a palił codziennie trawę na badaniach na mocz miał amferaminę ktorej nigdy w życiu nie brał i thc nie wykryto
MaxGaming (1:45, 16.10.18):
kolejna sprawa to jakość tych testów... miałem kiedyś robione testy na mocz dzień po paleniu trawy. THC ku mojemu zaskoczeniu nie wyszło wcale
MaxGaming (1:45, 16.10.18):
i czy serio oni robili wgl testy na rcki czy tylko narkotyki tradycyjne?
MaxGaming (1:44, 16.10.18):
co więcej są rcki na które nawet nie ma testów jeszcze
MaxGaming (1:44, 16.10.18):
nie wychodzi za bardzo w moczu. Ludzie donoszą że nawet dzień po nie ma śladu w moczu, po tylu dniach nie ma opcjo na pewno
MaxGaming (1:44, 16.10.18):
z ciekawości sprawdziłem, jesli już weźmiemy testy które obejmują RCki, do tego dodamy że to tylko najpopularniejsze to... najbardziej osławiony 3mmc(aka mefedron) jest do wykrycia w praktyce do 3 dni(testy drugie były robione bodaj po 10 dniach a przed walką to wiadomo...), ale już dzisiaj niemal równie popularny 4cmc(to nie mefedron ale sprzedają go jako mefedron bo działa tak samo a do niedawna był legalny - mefedron od wielu lat nie jest)
MaxGaming (1:24, 16.10.18):
to nie jest do końca takie proste, od zawsze przedtreningówki budzą kontrowersje. Na pewno żadna ilośc kofeiny tak nie robi
MaxGaming (1:23, 16.10.18):
pamiętajmy że kiedyś legalnie w przedtreningówkach stosowano eufedrynę dzisiaj uważaną za narkotyk, a leki z pseudefedryną(praktycznie zerowy efekt psychoaktywny w stsunku do efedryny) są ograniczone w sprzedaży
MaxGaming (1:21, 16.10.18):
nawet jedząc. Nie trzeba wcale walić w nos nawet
MaxGaming (1:21, 16.10.18):
jego oczy są porobione jak nie wiem. Wojo czerwone oczy są po trawie nie po takich rzeczach. Uwierzcie że doskonale wiem jak człowiek się zachowuje po takich rzeczach i jakie ma oczy. Testy na narkotyki wykryją amfę ale jej nawet nikt nie stosuje. Nie wykryje za to np 3mmc, 4mmc, 3cmc, 4cmc, hexenu.... mam wymieniać dalej? Każdy z tych środków działa dokładnie jak na filmiku. Jest tego tyle że nie można sobie wybierać i przebierać. Każdy z nich można zażyć po prostu w płyni
I am Lord (0:09, 16.10.18):
Co ciekawe też pod nosem mnie najbardziej swędziało i tam często próbowałem się drapać
I am Lord (0:08, 16.10.18):
dodajmy do tego adrealinę w kosmicznych ilościach u niego
I am Lord (0:07, 16.10.18):
trzymało mnie dobrą godzinę, myślałem że umrę
I am Lord (0:06, 16.10.18):
wszystko przez to zasrane swędzenie które czujesz pod skóra i drapanie na nie nie pomaga
I am Lord (0:06, 16.10.18):
mi tak ryj też wykręcało jak napalmshota przedawkowałem, a to była dawka tylko dwukrotna
Wojo (22:18, 15.10.18):
A adbuster się po prostu popisywał przed kamerami
Wojo (22:14, 15.10.18):
To, że oczy mi się robią czerwone (zwłaszcza zimą) to nie jest wina narkotyków (ani przedtreningówek)
Wojo (22:13, 15.10.18):
Mnie cały czas podejrzewają o branie narkotyków ludzie, którzy mają o tym nikłe pojęcie
Wojo (22:12, 15.10.18):
Ale co wy w ogóle opowiadacie, w życiu nie widzieliście naćpanego człowieka. Spójrzcie na jego oczy, są one normalne. To, że robi z siebie głupa i jest pobudzony wygraną i przedtreningówkami to jest inny temat
Ignatus (21:06, 15.10.18):
Trenując 20 lat na siłowni testowałem chyba wszystkie przedtreningówki na rynku- żadna nawet w podwójnej dawce nie porabia tak jak Adbustera- naćpany jest jak z podręcznika, zresztą widziałem wszystkie jego filmiki-totalnie inaczej się zachowuje normalnie
MaxGaming (16:03, 15.10.18):
a to czy on wrąbał mefę albo inny rcek do przedtrenigówki i wypił czy walnął w nos to wszystko jedno. Raczej dziwne gdyby walnał w nos bo spożycie oralne cechuje się tym że działanie trwa od kilkudziesięciu minut do kilku godzin a noski działają maksymalnie kilkadziesiąt minut, no może godzinkę zależy co wiadomo
MaxGaming (16:02, 15.10.18):
każdy kto widział kogoś po mefie ten z kilometra rozpozna co z tym typem jest
MaxGaming (16:02, 15.10.18):
nieźle lata ta szczęka, niezłe oczka a zachowanie wgl. Na pewno przedtrenigówka standardowa Na kofeinie na pewno
MaxGaming (16:00, 15.10.18):
ale gdzie duch sportu? Naćpany że ledwo co mówi i cieszy się że zwyciężył
MaxGaming (15:59, 15.10.18):
i jest problem. ale to jest problem że ciężko zakazać wszystkiego bo jest tyle stimów że nie da się nawet tego ogarnąć
MaxGaming (15:59, 15.10.18):
tylko potem zawodnikowi pikawa za którymś razem pada
MaxGaming (15:59, 15.10.18):
w lidze amatorskiej najcześciej to legalne co jest najśmieszniejsze
MaxGaming (15:58, 15.10.18):
znam ludzi którzy walczą amatorsko z takimi przedtrenigowkami zaprawianymi RCekami
MaxGaming (15:58, 15.10.18):
Wojo wiem co mówię, on był naćpany jak meserszmit. Ta przedtreningówka to conajmnej z 3mmc była haha
I am Lord (11:37, 15.10.18):
rafonix chyba go jeszcze tam wyzwał jak go magicala na noszach zawijali
Wojo (9:46, 15.10.18):
i nie byl pod wplywem narkotykow tylko co najwyzej emocji oraz ewentualnie przedtreningówek
Wojo (9:46, 15.10.18):
niepotrzebnie wysmiewal binkowskiego
MaxGaming (23:25, 14.10.18):
ten jego wywiad, ja nie wiem ile on tej nocy skonsumował narkotyków ale powinni zrobić anty doping nawet jeśli to freak fight w stylu reality show a nie sportowe wydarzenie
MaxGaming (23:25, 14.10.18):
Adbuster naćpany tak że to była porażka
MaxGaming (23:04, 14.10.18):
dobrze pociśnięta ta walka z magicalem, 40 sekund i połamany a 4lata spiny
MaxGaming (23:03, 14.10.18):
ale z rafonixa psychopata
MaxGaming (19:30, 11.10.18):
ale nie takie było pytanie
MaxGaming (19:30, 11.10.18):
Da się konfigurować php.ini dla subdomeny? Wrzucene pliku php.ini do katalogu subdomeny nie działa. Obsługa technicna odpowiedziała po prostu że zmiany dokonywane w php.ini przez directpael są przeprowadzane dla całej domeny
MaxGaming (19:13, 11.10.18):
? haha
I am Lord (18:52, 11.10.18):
Sorry ale chodziło mi o zdjęcie z tą kulką papieru
MaxGaming (15:52, 11.10.18):
nie no jeśli chodzi o to w sidebardze no to nieźle wyszłeś, przyznaję
MaxGaming (15:52, 11.10.18):
Johny Depp przy Tobie to zwykły nerdziak haha
ANtY (6:44, 11.10.18):
to w sidebarze? xDD
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.01822 sekund ] [ Liczba zapytań MySQL: 13 ]