Wiem, że jest już dużo takich kursów, ale niektórzy nie potrafią znaleźć, więc dodam jeszcze jeden dla zwiększenia szans odnalezienia :P
No to tak:
1. Ściągamy 39dll.dll.
2. Importujemy skrypty do gm.
3. Zapisujemy gdzieś projekt i do tego folderu wkładamy 39dll.dll.
4. Inicjujemy bibliotekę:
GML
//create:
dllinit(0,1,0)
/*
Argument0: Jeżeli mamy w folderze z projektem 39dll.dll to dajemy 0, jak nie to ścieżkę do niego.
Argument1: True, jeżeli chcemy załadować funkcje socketów.
Argument2: True, jeżeli chcemy załadować "utilities".
No i ogółem to nam ładuje bibliotekę - inicjuje ją.
*/
5. Tworzenie serwera:
GML
//create:
socket=tcplisten(12000,30,1) //tworzymy socketa
/*
Argument0: Port, na którym chcemy założyć serwer
Argument1: Maksymalna ilość ludzi na serwerze
Argument2: Tryb blokowania (zazwyczaj daje się true)
*/
//step:
nowygracz=tcpaccept(socket,1) //sprawdzamy czy ktoś doszedł
/*
Argument0: Id socketa, na którym nasłuchujemy.
Argument1: Tryb blokowania.
*/
if nowygracz //jezeli ktos doszedl
{
show_message('Ktos doszedl do gry!')
}
6. Podłączanie się do serwera:
GML
//create:
serwer=tcpconnect('127.0.0.1',12000,1)
/*
Argument0: Adres ip serwera.
Argument1: Port serwera.
Argument2: Tryb blokowania.
*/
if serwer
{
show_message('Polaczyles sie!')
}
else
{
show_message('Nie udalo sie!')
game_end()
}
7. Funkcje transferu i inne:
writebyte() - wysyła bajt - uzywa sie przewaznie do naglowkow. - jest to liczba od 0 do 255
writeint() lub writeshort() - wysyla sie jakąś liczbe
writestring() - wysyla stringa
readbyte() - odbiera bajt
itd itp. tak jak powyzej tylko write na read zamienic.
w tej kolejnosci co sie wysyla to w tej sie odbiera np.
writestring('ziomek')
writestring('lolek')
to jak odbieramy:
readstring()
readstring()
najpierw odbierzemy ziomek potem lolek.
Przed wysłaniem trzeba wyczyścić bufor czyli:
clearbuffer()
A po wysyłaniu:
sendmessage(uchwyt)
w naszym przypadku jak byśmy wysyłali w kliencie to uchwyt byłby zmienną serwer.
Jak odbieramy to najlepiej sprawdzic czy w ogole ktos cos wyslal czyli:
var size;
size=receivemessage(uchwyt) <- w naszym przypadku w serwerze uchwyt to zmienna nowygracz
if size
{
//odbieramy np:
zmienna=readstring()
}
inaczej jak damy samo receivemessage i readstring() to bedzie zmienna pusta bo jak nikt nic nie wysle to pusto odbierze.
Teraz np jak chcemy zamknąć serwer to piszemy:
closesocket(uchwyt/idsocketa)
No i jest jeszcze baardzo duzo funkcji ale przeciez wszystkich nie będe wymienial :)
A teraz czas na przyklad:
Serwer:
Create:
GML
socket=tcplisten(12000,2,1)
if socket<=0
{
show_message('Nie udalo zalozyc sie serwera!')
game_end()
exit;
}
show_message('Udalo sie zalozyc serwer! Czekam na drugiego gracza..')
other=0
juzdoszedl=0
Step:
GML
if juzdoszedl=0
{
var new;
new=tcpaccept(socket,1)
if new
{
other=new
show_message('Ktos doszedl do gry!')
juzdoszedl=1
}
}
else
{
if keyboard_check_pressed(vk_enter)
{
clearbuffer()
writestring(get_string('Podaj wiadomosc',0))
sendmessage(other)
}
var size;
size=receivemessage(other)
if size=0
{
show_message('Klient wyszedl z gry!')
game_end()
}
}
Klient:
Create:
GML
serwer=tcpconnect('127.0.0.1',12000,1)
if serwer<=0
{
show_message('Nie moge sie polaczyc!')
game_end()
exit;
}
show_message('Polaczylem sie i czekam na wiadomosc od serwera...')
Step:
GML
var size;
size=receivemessage(serwer)
if size<0 exit;
if size=0
{
show_message('Serwer został wyłączony!')
game_end()
exit;
}
show_message(readstring())
No i to by było na tyle. Jak ktoś zauważy błędy bo pewnie są to piszcie zaraz poprawię :P I jak czegos brakuje dodam.
Pozdro!