| 
	
		
		
			| Делаем свою первую MMO на GameMaker 8.0 №1! (+39dll) |  |  |  | 
| Deswing | Дата: Суббота, 25 Декабря 2010, 22:51 | Сообщение # 1 |  |   заслуженный участник Сейчас нет на сайте | В последнее время создавать онлайн игры на GameMaker стало очень популярно... Но, к сожалению, не все могут разобраться в 39dll (так называется доп. библиотека для сетевых соединений). В этой статье я покажу как создать online TDS! Для начала давайте подумаем... Что это за связь - клиент-сервер?
 
   На данной таблице мы видем один сервер и трое игроков (клиентов), которые зашли в игру... Давайте копнём чуть глубже? Здесь сервер - центр. Тоесть обмен данных идет только через сервер! Например чтобы передать переменную image_angle клиенту надо отправить информацию серверу, потом сервер должен прочесть этот "пакет" и отправить другим (а они тоже должны прочесть). Если так подумать - одну и туже переменную надо будет вписывать в 4-ех местах! Ну ничего... Мы ведь на энтузиазме убийцу WoW делаем, да?
    Начнем же писать код! Для начала скачайте архив(зеркало №2) с 39dll и проектом со скриптами... Итак, вы скачали архив. Теперь разархивируйте и запустите проект gmk! Проект полностью пустой, одни только Script'ы загружены...
 Для начала напишем клиент игры! Создайте обьект objControl и в событии create (создание) вставьте код:
 
 Code dllinit(0, true, true); //Подключаем 39dll (библиотека должна быть в папке с игрой (проектом)!!!) ip = get_string("Enter address to connect to", "127.0.0.1");  //Присваиваем переменной ip адрес сервера, на котором будем играть (через get_string)
 port = get_integer("Enter port to connect to", 14804);  //По какому порту играем (если на сервере будет 14804 - оставляем)
 nick = get_string("Введите свой ник", "newPlayer"); //Присваиваем себе ник
 socket = tcpconnect(ip, port, 1);   //По переменным (смотрите выше) ip, port пытаемся подключиться к серверу
 if(!socket)   //Если не удалось
 {
 error_message("Unable to connect to server"); //Показываем ошибку
 exit; //И выходим
 }
 setnagle(socket, false);  //Без коментариев, для меня это - темный лес
 //Отправляем свой ник
 clearbuffer(); //Чистим буффер (чтобы не глючило, поменьше мусора)
 writebyte(playernick);
 writestring(nick, true);
 sendmessage(socket);
 
 //Добавляем в Playerlist
 for(i = 0; i < 256; i += 1)
 players[i] = -1;
 
 i = instance_create(32, 32, objPlayer);
 Пишем в step (шаг) 
 Code while(1)                           //Начинается бесконечный цикл http://ru.wikipedia.org/wiki/Бесконечный_цикл {
 size = receivemessage(socket);    //Получить следующее сообщение в очереди
 if(size < 0)break;               //Если не получили сообщение, то выходим из цикла
 if(size == 0)                    //Если отключились от сокета - выходим
 {
 instance_destroy(); //уничтажаем обьект (а при уничтожении рассмотрим код ниже)
 break;
 }
 mid = readbyte();     //Прочитать сообщение (readbyte() читает данные)
 
 switch(mid)
 {
 case newplayer:
 pid = readbyte();       //Читаем данные, которые отправил нам сервер (у нас это - playerid)
 player = instance_create(0, 0, objRemote); //Создаем objRemote (remote player)
 player.x = readshort(); //Читаем координаты х
 player.y = readshort(); //Читаем координаты у
 player.nick = readstring(); //Читаем ник (переменную)
 players[pid] = player;  //Добавляем в playerlist
 break; //Если не ошибаюсь, то разрыв соединения
 
 case playerlocation:
 player = players[readbyte()];   //Смотрим айди персонажа в playerlist
 player.x = readshort();         //set x
 player.y = readshort();         //set y
 break;
 
 case exitgame:
 player = players[readbyte()];   //получить идентификатор игрока из playerlist
 with(player)instance_destroy(); //Уничтожаем
 break;
 
 case playernick:
 player = players[readbyte()];   //Получить идентификатор игрока из playerlist
 player.nick = readstring();     //Смотрим никнейм
 break;
 }
 }
 
Ура! Мы научились читать переменные, которые отправил сервер! Для профилактики objRemote - Это другой игрок, а objPlayer - это игрок с нашей стороны (мы им управляем)
 Событие User Defined 0
 
 Code clearbuffer(); writebyte(exitgame);
 sendmessage(socket);
 sleep(100);
 closesocket(socket);
 dllfree();
Событие Destory (Уничтожение)
 
 Game End
 
  Урааа! Мы вписали все в обьект objControl! Теперь возьмемся за нашего игрока, которым будем управлять! ObjPlayer!
 Создайте обьект objPlayer и в create (создание) пишем:
 
 Code alarm[0]=1; //Запускаем будильник №0В alarm 0 (Будильник №0):
 
 Quote //Отправляем переменные objPlayer серверу   clearbuffer(); //Перед отправкой чистим буффер   writebyte(playerlocation); //отправляем playerlocation   writeshort(x); //Отправляем координату х   writeshort(y); //Отправляем координату у   sendmessage(objControl.socket); //Всё это отправляем серверу   alarm[0] = 2; //опять запускаем будильник (получается таймер... Даже цикл)))Дальше можете в коде GML (как вам удобнее) придумать перемещение (мы уже приписали отправку координат, теперь надо управление придумать)
 Я сделаю самое простое
 Right:
 
 Left:
 
 Up:
 
 Down:
 
  Тадамс №2!))) Мы создали обьект игрока! Теперь возьмемся за других игроков (objRemote) создаем, как всегда, обьект objRemote! Вы надеюсь не забыли? Как получаем переменные к нему? Ммм? Смотрим выше если что ^__^
 Создание (create)
 
 Code nick = ""; //Переменная никнеймаDraw (Рисуем)
 
 Code draw_sprite(sprite_index, image_index, x, y); draw_text(x, y, nick); //по х у, относительно спрайта, пишем свой ник!
 Гааа! *-* Вааа! *_* Мы написали клиент! Как написать сервер - http://gcup.ru/forum/36-11940-1#182295 
 
 Сообщение отредактировал Deswing - Воскресенье, 26 Декабря 2010, 13:53 |  |  |  |  |  | 
| Gefre | Дата: Суббота, 25 Декабря 2010, 23:34 | Сообщение # 2 |  |   Любитель ретро игр Сейчас нет на сайте | Deswing, крутая статья, всё хорошо написано будет понятно даже чайникам.Продолжай в том же духе. Теперь у меня в голове идея игры, которую в будущем я постараюсь реализовать. Вот только одно плохо, 80% прочитавших статью тупо скопирует текст.
 P.S.Deswing, держи плюс.
 
 
   Люблю получать +
 |  |  |  |  |  | 
| Deswing | Дата: Суббота, 25 Декабря 2010, 23:38 | Сообщение # 3 |  |   заслуженный участник Сейчас нет на сайте | Gefre, тогда пусть они забьют на геймдев вообще! Спасибо за +) Завтра про сервер напишу и покажу как сделать авторизацию |  |  |  |  |  | 
| Gefre | Дата: Суббота, 25 Декабря 2010, 23:44 | Сообщение # 4 |  |   Любитель ретро игр Сейчас нет на сайте | Quote (Deswing) Gefre, тогда пусть они забьют на геймдев вообще!В том и дело, что не забьют. Будут тырить код из чужих исходников или сидеть на конструкторах без скриптовых языков.
 
 Quote (Deswing) Завтра про сервер напишу и покажу как сделать авторизациюПродолжай пожалуйста дальше, что-то идея онлайн игры меня сильно захватила.
 P.S. Deswing, у тебя хорошо получается писать статьи для новичков, можешь даже учебник написать по GM, я бы точно его читал.
 
 
   Люблю получать +
 |  |  |  |  |  | 
| simtiko | Дата: Суббота, 25 Декабря 2010, 23:54 | Сообщение # 5 |  |   почти ветеран Сейчас нет на сайте | Quote (Gefre) В том и дело, что не забьют. Будут тырить код из чужих исходников или сидеть на конструкторах без скриптовых языков.  Дык, ну и что? В такие игры никто не будет играть и их скоро забудут...   Deswing, Отличная статья, молодец. + |  |  |  |  |  | 
| zik13 | Дата: Воскресенье, 26 Декабря 2010, 00:01 | Сообщение # 6 |  |   Dark wolf Сейчас нет на сайте | я хоть и нуп но тупо код копировать не буду буду сидеть прилипший к монитору и разбираться ))  статья супер +++++ |  |  |  |  |  | 
| Deswing | Дата: Воскресенье, 26 Декабря 2010, 00:05 | Сообщение # 7 |  |   заслуженный участник Сейчас нет на сайте | Quote (Gefre) В том и дело, что не забьют. Будут тырить код из чужих исходников или сидеть на конструкторах без скриптовых языков.пусть сидят)) Я лично стырил авторизацию себе с примера одного хдд
 
 Quote (Gefre) Продолжай пожалуйста дальше, что-то идея онлайн игры меня сильно захватила.ну тут все дело в логике... Советую завести тетрадку со своими "идеями" и реализацией (возможной)
 
 Quote (Gefre) P.S. Deswing, у тебя хорошо получается писать статьи для новичков, можешь даже учебник написать по GM, я бы точно его читал.спасибо большое, не ожидал
   
 Quote (simtiko) Deswing, Отличная статья, молодец. +Спасибо
 Добавлено (26.12.2010, 00:05)---------------------------------------------
 
 Quote (zik13) я хоть и нуп но тупо код копировать не буду буду сидеть прилипший к монитору и разбираться )) статья супер +++++пока детально изучи код. Завтра напишу как сервер написать) Тут всё "считывание" идет через циклы и таймер
 |  |  |  |  |  | 
| Gefre | Дата: Воскресенье, 26 Декабря 2010, 00:07 | Сообщение # 8 |  |   Любитель ретро игр Сейчас нет на сайте | Quote (simtiko) Дык, ну и что? В такие игры никто не будет играть и их скоро забудут... Согласен с тобой, но человек, сделавший такую игру, потратил свое время в пустую и потерял кусочек своей жизни.
 Кстати благодаря статье Deswing, инет сообщество через несколько месяцев увидет онлайн игру написанную школьником, но это только в будущем, пока этому школьнику надо в совершенстве овладеть гамаком.
 
 
   Люблю получать +
 |  |  |  |  |  | 
| zik13 | Дата: Воскресенье, 26 Декабря 2010, 00:10 | Сообщение # 9 |  |   Dark wolf Сейчас нет на сайте | Quote (Deswing) автра напишу как сервер написать) а когда |  |  |  |  |  | 
| Deswing | Дата: Воскресенье, 26 Декабря 2010, 00:10 | Сообщение # 10 |  |   заслуженный участник Сейчас нет на сайте | Quote (Gefre) Кстати благодаря статье Deswing, инет сообщество через несколько месяцев увидет онлайн игру написанную школьником, но это только в будущем, пока этому школьнику надо в совершенстве овладеть гамаком.Извини конечно... Но я, о великий школьни4ег, уже ммо написал
   Как только допишу статью и доделаю пример ММОРПГ команда Game-Mix превратится в О.Н.И. (Орден Независимых Игроделов) и начнем делать ммо. Если желаете - милости просим
 |  |  |  |  |  | 
| Gefre | Дата: Воскресенье, 26 Декабря 2010, 00:11 | Сообщение # 11 |  |   Любитель ретро игр Сейчас нет на сайте | Quote (Gefre)  тут все дело в логике... Советую завести тетрадку со своими "идеями" и реализацией (возможной)У меня таких тетрадок три по 96 листов, там общие идеи для игр и ещё 2 тетради по 48 листов, там отдельные игры.
 
 
   Люблю получать +
 |  |  |  |  |  | 
| Deswing | Дата: Воскресенье, 26 Декабря 2010, 00:11 | Сообщение # 12 |  |   заслуженный участник Сейчас нет на сайте | я когда статью писал болела голова... Ну не знаю... В диапазоне 11:00-18:00
 |  |  |  |  |  | 
| Gefre | Дата: Воскресенье, 26 Декабря 2010, 00:17 | Сообщение # 13 |  |   Любитель ретро игр Сейчас нет на сайте | Quote (Deswing) Но я, о великий школьни4ег, уже ммо написал Извиняю, оказывается кто-то меня уже опередил
   
 Quote (Deswing) Как только допишу статью и доделаю пример ММОРПГ команда Game-Mix превратится в О.Н.И. (Орден Независимых Игроделов) и начнем делать ммо. Если желаете - милости просим У меня есть желание, но я уже попросился в другую команду(там надеюсь научусь GM), но возможно если твоя команда будет Орденом Независимых  Игроделов, то приду к вам.
 
 
   Люблю получать +
 
 
 Сообщение отредактировал Gefre - Воскресенье, 26 Декабря 2010, 00:18 |  |  |  |  |  | 
| Deswing | Дата: Воскресенье, 26 Декабря 2010, 00:20 | Сообщение # 14 |  |   заслуженный участник Сейчас нет на сайте | Quote (Gefre) У меня есть желание, но я уже попросился уже в другую команду(там надеюсь научусь), но возможно если твоя команда будет Орденом Независимых Игроделов, то приду к вам.так и есть, мы независимы! Мне все равно на национальность, родной язык, используемое ПО и вход в другие команды! Мы независимы! Независимы от других команд, несем всю тяжесть только на себе!
   
 Quote (Gefre) Извиняю, оказывается кто-то меня уже опередилНичего страшного) И кстать насчет двух месяцев - ты загнул! За неделю ты уже научишься ммо делать
   
 
 Сообщение отредактировал Deswing - Воскресенье, 26 Декабря 2010, 00:22 |  |  |  |  |  | 
| zik13 | Дата: Воскресенье, 26 Декабря 2010, 00:30 | Сообщение # 15 |  |   Dark wolf Сейчас нет на сайте | Млин не могу дождаться второй части ) |  |  |  |  |  | 
| Deswing | Дата: Воскресенье, 26 Декабря 2010, 00:32 | Сообщение # 16 |  |   заслуженный участник Сейчас нет на сайте | немного переназвал тему   Блин! Я так и не понял что такое
 setnagle(socket, false); ...
 И скорее всего значение
 break;
 я как-то не так понял
 
 
 Сообщение отредактировал Deswing - Воскресенье, 26 Декабря 2010, 00:34 |  |  |  |  |  | 
| Gefre | Дата: Воскресенье, 26 Декабря 2010, 00:34 | Сообщение # 17 |  |   Любитель ретро игр Сейчас нет на сайте | Quote (Deswing) так и есть, мы независимы! Мне все равно на национальность, родной язык, используемое ПО и вход в другие команды! Мы независимы! Независимы от других команд, несем всю тяжесть только на себе!Найти такую команду, это была моя мечта, я с вами.
 
 Quote (Deswing) И кстать насчет двух месяцев - ты загнул! За неделю ты уже научишься ммо делатьНу я писал, что через несколько месяцев, но если за неделю освою, это будет вообще круто!
 
 
   Люблю получать +
 |  |  |  |  |  | 
| Deswing | Дата: Воскресенье, 26 Декабря 2010, 00:37 | Сообщение # 18 |  |   заслуженный участник Сейчас нет на сайте | Quote (Gefre) Найти такую команду, это была моя мечта, я с вами.Если я буду лгать, то лгать до конца ©
 
 Quote (Gefre) Ну я писал, что через несколько месяцев, но если за неделю освою, это будет вообще круто!при большом желании и хорошем руководстве - всё возможно) В этой статье я показываю базу.. Как по мне базой является передача переменных (клиент-сервер) ну а дальше главное чтобы нервов и энтузиазма хватило
 |  |  |  |  |  | 
| URGINSAN | Дата: Воскресенье, 26 Декабря 2010, 00:37 | Сообщение # 19 |  |   почти ветеран Сейчас нет на сайте | Deswing, большое спасибо за статью, после ее прочтения я стал уже задумываться о создании онлайн 3д игры на гм.... Лови плюсы. Сорри.. репутацию поднять смогу только через 7 дней. 
 Я на драйве
 
 
 Сообщение отредактировал URGINSAN - Воскресенье, 26 Декабря 2010, 00:39 |  |  |  |  |  | 
| Deswing | Дата: Воскресенье, 26 Декабря 2010, 00:39 | Сообщение # 20 |  |   заслуженный участник Сейчас нет на сайте | URGINSAN, много мароки вас ждет... На 39длл.ру посмотрите примеры (там был один в 3D) но я советую 2д или 2,5д... Рендер и умелые руки - наше все
   |  |  |  |  |  
 |