GMC Bulgaria

Здравейте ( Вход | Регистрация )

 
Reply to this topicStart new topic
Faucet Networking, basics
Zlobara
коментар 00:16:18, 24-December-2012, Monday
Коментар #1


Мълчаливко


Група: Потребител
Коментари: 4
Регистриран: 23.12.12
Потребител № 1717



Та така...Какво е faucet networking?
Това е сравнително ново extension за Гейм Мейкър,който позволява да се правят мултиплеър игри.Води се по-добро от 39 длл,не съм навътре в тия неща,затова не мога да обясня точно какво му е по-доброто,но да приемем факта за верен,защото самият автор на популярното старо dll казва,че го е написал доста куцо.
Та какво трябва да знаем за начало?
За начало трябва да знаем,че връзките могат да се извършат с два вида протоколи TCP и UDP.Първият вид ( http://bg.wikipedia.org/wiki/TCP ) е най-разпространеният интернет протокол.Лично аз никога не съм се занимавал с втория вид,затова не смея да говороя за него.
Също така трябва да знаем и какво е socket.Сокетът е връзката между клиент и сървър или обратното,чрез която се пращат пакети с дата.Също така имаме бъфери,които "държат" въпросната дата.При 39 длл си има default buffer,а при faucet networking има два бъфера send i receive buffer,които не може да се видят(нямат си имена),но може да се използват.Също така можете и да си направите свой бъфер с фунцкията
Код
buffer=buffer_create()
,ама да не се задълбаваме в подробности...Също така датата,която изпращаме трябва да има определен размер:
Код
//Byte = 1 Byte (heh) and can range from 0 to 255.                                      
//Short = 2 Bytes and can range from -32768 to +32767.                                  
//UShort = 2 Bytes and can range from 0 to +65536                                      
//Int = 4 Bytes and can range from -2147483648 and +2147483647                          
//UInt = 4 Bytes and can range from 0 and +4294967296                                
//Float = 4 Bytes                                                                      
//Double = 8 Bytes

Например,ако имаме да пращаме живот на играч,който е максимум 100,няма да използваме short,а byte,за да не създаваме излишен трафик...
Getting started(Да започваме!)
Създаваме server.gmk и client.gmk всяко с по един обект control вътре.
Първо пъхаме в create-a control-a на клиента:
Код
server=tcp_connect("127.0.0.1",7777);//търсим сървър на този адрес

После пъхаме в control обекта на сървъра в create-евент:
Код
listen = tcp_listen(7777);//това е акцептор на всички адреси през този порт

На същия обект в степ:
Код
socket = socket_accept(listen); //търсим клиенти от адреса на акцептора

Та сега това "socket" ни се води сокета на клиента,който сме приели.Той приема стойности само,когато се логне клиент,иначе =0...
Па сега нека му пратим на клиента нещо...
в същия степ евент слагаме:
Код
if (socket>0)
{
    //send player to client
    write_byte(socket,1); //1 byte //firstbyte
    write_byte(socket,5); //1 byte
    socket_send(socket); //пращаме по сокета на логналия клиент...
}

write_byte(socket,1); //1 byte //firstbyte- е стойност,която ще получим в едно нещо наречено integer,което се превежда идентификатор(идентифицира,разпознава собщенията)...
write_byte(socket,5); //1 byte- е съобщението,което получава клиента като стойност при определен случай на индификатора.
socket_send(socket); //пращаме по сокета на логналия клиент... -е това вече е обяснено...

Време е за клиента сега.Степ евента на control трябва така да го направиме да изглежда:
Код
tcp_receive(server,1);
    msgid=read_byte(server);
    switch (msgid) //индентификатор
    {
        case 1:
            tcp_receive(server,1);
            aaa=read_byte(server);
            break;
    }

Та така.С първото tcp_receive получаваме "write_byte(socket,1); //1 byte //firstbyte",първият байт,който ни е пратен и индификатора различава.От него надолу индификатора казва според стойността му какво трябва да се случи.В нашия случай стойността на msgid=read_byte(server);,което е е получената стойност на write_byte(socket,1); е 1 (case 1:) и е получено по сокета server.
Следователно индификатора казва,че нататък трябва да се получи още един байт tcp_receive(server,1);,който го четем aaa=read_byte(server);.
Този байт се оказва петицата от write_byte(socket,5); //1 byte .

Сега,ако връзката наистина се е получила сложете:
Код
if variable_local_exists("aaa")
{
draw_text(50,50,aaa);
};

Трябва да се види една петица tongue.gif clap.gif
Ето тука качих това,за което говорих досега:
http://www.2shared.com/file/iiVLHt_3/faucettutorial.html?
Фауцет се тегли от http://gmc.yoyogames.com/index.php?showtopic=498062 има едно зелено текстче в поста "here".В .zip-a,който изтеглите има и едно pdf ,което ще ви научи на всичко останало...
+В това,което съм качил добавих още няколко обяснения,за да е по-лесно. tongue.gif
Go to the top of the page
 
+Quote Post
Evgenit
коментар 16:59:49, 24-February-2013, Sunday
Коментар #2


Мълчаливко


Група: Потребител
Коментари: 4
Регистриран: 24.02.13
Потребител № 1718



Тъкмо което ми трябваше ! Но, да попитам, не разбрах как се изпращат променливи ( и как се разпознават ) .
Примерно, клиент1 променя х с 2, изпраща до сървъра, че е направил това (как ?) , сървъра изпраща на клиент2 и 3 и т.н. , че клиент1 си е променил х с 2 .
Може ли да обясниш ?
Go to the top of the page
 
+Quote Post
Пешо
коментар 17:27:15, 24-February-2013, Sunday
Коментар #3


Редовен бъбривко
Икона на група

Група: Администратор
Коментари: 661
Регистриран: 08.07.05
Град: Бургас
Потребител № 44



Това е до твоя протокол. Трябва да си измислиш протокол, по който клиента общува със сървъра.

Примерен протокол е да му кажеш някак си "аз си променихх координатите на x,y"

В примерния код променливата msgid може да се ползва именно с такава цел. Ти имаш достъп до функции за пращане и получаване на данни, но вече ти сам трябва да измислиш как да ги ползваш.


--------------------
Go to the top of the page
 
+Quote Post
Evgenit
коментар 17:39:59, 24-February-2013, Sunday
Коментар #4


Мълчаливко


Група: Потребител
Коментари: 4
Регистриран: 24.02.13
Потребител № 1718



Ехх, сега трябва да си напрягам мозъка biggrin.gif
Между другото, msgid променлива ли е ?
Go to the top of the page
 
+Quote Post
Пешо
коментар 17:41:28, 24-February-2013, Sunday
Коментар #5


Редовен бъбривко
Икона на група

Група: Администратор
Коментари: 661
Регистриран: 08.07.05
Град: Бургас
Потребител № 44



Код
msgid=read_byte(server);


Излиза, че е smile.gif Можеш сам да създаваш променливи, когато си поискаш.


--------------------
Go to the top of the page
 
+Quote Post
Evgenit
коментар 17:42:48, 24-February-2013, Sunday
Коментар #6


Мълчаливко


Група: Потребител
Коментари: 4
Регистриран: 24.02.13
Потребител № 1718



Аха, мерси за помоща, между другото колко хора има в тоя форум седмично/дневно ?
msgid значи е нещо като съобщение на сървъра? ( в този пример)
Go to the top of the page
 
+Quote Post
Пешо
коментар 17:47:54, 24-February-2013, Sunday
Коментар #7


Редовен бъбривко
Икона на група

Група: Администратор
Коментари: 661
Регистриран: 08.07.05
Град: Бургас
Потребител № 44



Както ти обясних в имейла, няма особено активност. А се появи един-двама юзъра, а никой не се появи. Бившите активни потребители общуваме по други методи на комуникация, например Skype и Facebook.

Относно протокола, ти трябва да решиш какво ще се обменя като данни. След това ти решаваш как ще си създадеш пакетите. Пакета е последователност от байтове.

В горния пример, msgid е променлива, която чете първия байт от пакета. Според стойността му, ще знаеш какви да са следващите пакети. Трябва както да го измисмиш, така и предварително да си го документираш smile.gif


--------------------
Go to the top of the page
 
+Quote Post
Evgenit
коментар 20:22:22, 24-February-2013, Sunday
Коментар #8


Мълчаливко


Група: Потребител
Коментари: 4
Регистриран: 24.02.13
Потребител № 1718



Не мога да се справя ! Клиента приема тази стойност дадена в примера само като влезе! Как да го направя да приема постоянно ?
Go to the top of the page
 
+Quote Post
Пешо
коментар 20:56:50, 26-February-2013, Tuesday
Коментар #9


Редовен бъбривко
Икона на група

Група: Администратор
Коментари: 661
Регистриран: 08.07.05
Град: Бургас
Потребител № 44



Неща ти куца алгоритъма, изглежда. Трябва първо на първо да се научиш да програмираш. Сори че го казвам, но според въпроса ти, така ми се струва. Примера на Zlobarq не е най-подходящ за реални приложения, но след като знаеш кои са ти функциите за четене и запис в сокети, останалото е да си изградиш програмата, която да ги чете. Ако не знаеш как, по-добре недей започвай с мултиплеяр игри, а с нещо, което да ти даде малко или много опит.


--------------------
Go to the top of the page
 
+Quote Post
яверт
коментар 19:53:45, 01-March-2013, Friday
Коментар #10


Засмян тъпоъгълник :D
Икона на група

Група: Администратор
Коментари: 1790
Регистриран: 21.07.08
Град: Това е място, населено с много хора. FPS: 60
Потребител № 1116



Съвет - не си хаби времето с мултиплеър системата на гм, спести си главоболия. Говоря ти от опит. Захвани се с нещо по-сериозно.


--------------------
Цитат
Пешо:
4:53:46
Я недейти са карайти тука че да ни ва зашливйъ
Go to the top of the page
 
+Quote Post
Zlobara
коментар 20:42:30, 15-June-2013, Saturday
Коментар #11


Мълчаливко


Група: Потребител
Коментари: 4
Регистриран: 23.12.12
Потребител № 1717



Цитат(Пешо @ 18:41:28, 24-February-2013, Sunday) *
Код
msgid=read_byte(server);


Излиза, че е smile.gif Можеш сам да създаваш променливи, когато си поискаш.

Значи виж сега пичага,идеята е да се направи индетификатор.
Сървъра праща информация и клиента я чете така:
Първия байт е ID-то на съобщението-msgid.Както знаем той може да има стойност от 0 до 255.И според неговата стойност клиента продължава по различен начин да прави разни неща.
Не помня как точно го бях направил в този екзампъл,но принципно е прави с
Цитат
switch(msgid)
{
case число от 0 до 255:
правим нещо
break;
}

Ако не знаеш какво прави switch и това ти обияснявам.Switch проверява стойностите на дадена променлива ,прави дадена операция и е по-мързелив вариант от това да правиш if-ове".С други думи,ако ползваш if кода ще излгежда така:
Цитат
if msgid=число от 0 до 255 {правим нещо}
if msgid=друго число от 0 до 255 {правим друго нещо}

Та пичага ако имаш въпроси скайпа ми е happy_mudvayne.Аз рядко влизам тук,затова ще ти е по-просто по скайп да питаш.Ама надявам се да знаеш basic работите,защото все още си спомням на 10 годинки как исках да направя "супер якото най-велико MMORPG на света" и до никъде не стигнах...Ааа и да не забравя с гейм мейкър не се правят хубави игри като цяло.

@Яверт
Еми то аз само с GM мога да работя,тъй като само с компютрите тотално неграмотен.Но пък с Гейм Мейкъра и faucet-а можеш спокойно да се научиш да правиш този тип работи и после като разбереш как работрят да си направиш сериозна игра на някой истински език.Освен това чудото faucetnet се води доста по-бързо от противното и старо 39длл. Wink(LBG).gif

Ааа и да не забравя този пичага,автора на FAUCET има едно творение: http://ganggarrison.com/ .Макар и demake на team fortress 2 с примитивни графики,игрицата си е супер луда и винаги има играчи в сървърите.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 потребител(и) четат тази тема (1 гости и 0 скрити)
0 Потребител(и):

 



Олекотена версия Час: 03:55:32, 19.05.24