Делаем свою первую 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д... Рендер и умелые руки - наше все
|
|
| |
|