Четверг, 26 Декабря 2024, 10:14

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Делаем свою первую MMO на GameMaker 8.0 №1! (+39dll)
DeswingДата: Суббота, 25 Декабря 2010, 22:51 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
В последнее время создавать онлайн игры на GameMaker стало очень популярно... Но, к сожалению, не все могут разобраться в 39dll (так называется доп. библиотека для сетевых соединений). В этой статье я покажу как создать online TDS!
Для начала давайте подумаем... Что это за связь - клиент-сервер?

На данной таблице мы видем один сервер и трое игроков (клиентов), которые зашли в игру... Давайте копнём чуть глубже? Здесь сервер - центр. Тоесть обмен данных идет только через сервер! Например чтобы передать переменную image_angle клиенту надо отправить информацию серверу, потом сервер должен прочесть этот "пакет" и отправить другим (а они тоже должны прочесть). Если так подумать - одну и туже переменную надо будет вписывать в 4-ех местах! Ну ничего... Мы ведь на энтузиазме убийцу WoW делаем, да? biggrin

Начнем же писать код! Для начала скачайте архив(зеркало №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 (Уничтожение)
Code
event_user(0);

Game End
Code
event_user(0);

  • Урааа! Мы вписали все в обьект 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:
    Quote
    x+=6

    Left:
    Code
    x-=6

    Up:
    Quote
    y+=6

    Down:
    Code
    y-=6

  • Тадамс №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, я бы точно его читал.

    спасибо большое, не ожидал happy
    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ег, уже ммо написал biggrin
    Как только допишу статью и доделаю пример ММОРПГ команда Game-Mix превратится в О.Н.И. (Орден Независимых Игроделов) и начнем делать ммо. Если желаете - милости просим
    GefreДата: Воскресенье, 26 Декабря 2010, 00:11 | Сообщение # 11
    Любитель ретро игр
    Сейчас нет на сайте
    Quote (Gefre)
    тут все дело в логике... Советую завести тетрадку со своими "идеями" и реализацией (возможной)

    У меня таких тетрадок три по 96 листов, там общие идеи для игр и ещё 2 тетради по 48 листов, там отдельные игры.



    Люблю получать +
    DeswingДата: Воскресенье, 26 Декабря 2010, 00:11 | Сообщение # 12
    заслуженный участник
    Сейчас нет на сайте
    Quote (zik13)
    а когда

    я когда статью писал болела голова... Ну не знаю... В диапазоне 11:00-18:00
    GefreДата: Воскресенье, 26 Декабря 2010, 00:17 | Сообщение # 13
    Любитель ретро игр
    Сейчас нет на сайте
    Quote (Deswing)
    Но я, о великий школьни4ег, уже ммо написал

    Извиняю, оказывается кто-то меня уже опередил sad
    Quote (Deswing)
    Как только допишу статью и доделаю пример ММОРПГ команда Game-Mix превратится в О.Н.И. (Орден Независимых Игроделов) и начнем делать ммо. Если желаете - милости просим

    У меня есть желание, но я уже попросился в другую команду(там надеюсь научусь GM), но возможно если твоя команда будет Орденом Независимых Игроделов, то приду к вам.



    Люблю получать +


    Сообщение отредактировал Gefre - Воскресенье, 26 Декабря 2010, 00:18
    DeswingДата: Воскресенье, 26 Декабря 2010, 00:20 | Сообщение # 14
    заслуженный участник
    Сейчас нет на сайте
    Quote (Gefre)
    У меня есть желание, но я уже попросился уже в другую команду(там надеюсь научусь), но возможно если твоя команда будет Орденом Независимых Игроделов, то приду к вам.

    так и есть, мы независимы! Мне все равно на национальность, родной язык, используемое ПО и вход в другие команды! Мы независимы! Независимы от других команд, несем всю тяжесть только на себе! smile
    Quote (Gefre)
    Извиняю, оказывается кто-то меня уже опередил

    Ничего страшного) И кстать насчет двух месяцев - ты загнул! За неделю ты уже научишься ммо делать wink


    Сообщение отредактировал Deswing - Воскресенье, 26 Декабря 2010, 00:22
    zik13Дата: Воскресенье, 26 Декабря 2010, 00:30 | Сообщение # 15
    Dark wolf
    Сейчас нет на сайте
    Млин не могу дождаться второй части )
    DeswingДата: Воскресенье, 26 Декабря 2010, 00:32 | Сообщение # 16
    заслуженный участник
    Сейчас нет на сайте
    немного переназвал тему happy
    Блин! Я так и не понял что такое
    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д... Рендер и умелые руки - наше все happy
    • Страница 1 из 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • »
    Поиск:

    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг