Вторник, 03 Декабря 2024, 23:56

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Результаты поиска
mehanicДата: Воскресенье, 26 Июля 2015, 19:10 | Сообщение # 1 | Тема: Обращение к конкретному объекту.
был не раз
Сейчас нет на сайте
Используй with(all), перебирает все объекты.
И проблема не в этом, а в том что у объекта отсутствует переменная.


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}


Сообщение отредактировал mehanic - Воскресенье, 26 Июля 2015, 19:12
mehanicДата: Суббота, 11 Июля 2015, 16:18 | Сообщение # 2 | Тема: html5 мультиплеер
был не раз
Сейчас нет на сайте
В любом случаи делать мультиплеер игру в гмс на хтмл 5 не вижу смысла... тормознуто, баги и т.д .. лешче сделать ехе и арендовать серыер для этого, при этом всё будет работать и функциональность будет одинаковая.:) (ох ужас сколько ошибок с телефона...)

Добавлено (11 июля 2015, 16:18)
---------------------------------------------
Кстати, по теме вопроса... если работают функции http_get_... то юзай asynchronous HTTP


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Суббота, 11 Июля 2015, 15:52 | Сообщение # 3 | Тема: html5 мультиплеер
был не раз
Сейчас нет на сайте
Как мне известно, а известно довольно не точно, можно отправлять сокеты с гмс на любой айпи и порт... следовательно использовать посторонние дополнения смысла не вижу... юзаем networking и читаем статьи Xdominator или мои.:)

http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Четверг, 09 Июля 2015, 14:12 | Сообщение # 4 | Тема: Мультиплеер GMS(Game Maker Studio networking) 2 часть.
был не раз
Сейчас нет на сайте
1 часть - 3 часть на другом сайте - 4 часть на другом сайте(примеры тут же)
Мультиплеер в GMS #2 Игроки, ходьба, стрельба, жизни и немножко защиты.
Вот и пришло время написать вторую статью, думаю она будет гораздо больше чем первая, хотя комментировать я буду реже, потому что практически всё мы прошли в 1 части.

И так, откроем наш проект, в котором сделано абсолютно всё из 1 части и приступим. Начнём с создания спрайтов и объектов, создадим спрайт spr_bullet в сервере и клиенте который будет залит желтым цветом и иметь размер 8х8 пикселей, отцентрируем. Создадим объект obj_bullet в сервер и клиенте и присвоим ему наш спрайт. Всё, остальные объекты у нас уже есть.

Начнём с сервера...
СЕРВЕР: Первым делом создадим скрипт Send_to_all:
Код

for(ii=0;ii<ds_list_size(obj_controller.SocketList);ii++){
          var result=ds_list_find_value(obj_controller.SocketList,ii);
          network_send_packet( result , obj_controller.Buffer , buffer_tell( obj_controller.Buffer ) );
}

Как видно из скрипта, мы проходимся циклом по листу с сокетами(см. 1 часть) и отсылаем буффер каждому клиенту. Всё просто.

Теперь в сервере и в клиенте в объекте obj_player в Create пишем:
Код

image_speed=0

И в Step к этому объекту так же дописываем:
Код

image_angle=direction

В Draw к этому объекту переносим иконку из вкладки draw под названием Draw Self, не забываем что это мы делаем и в клиенте, и в сервере, и так же пишем код:
Код

draw_text(x,y,hp)


Теперь спасибо пользователю Qvant (замечание от пользователя) заменяем код в СЕРВЕРЕ в obj_controller в Asynchronouos в Networking на:
Код

var type_event = ds_map_find_value( async_load , "type" );/*получаем тип пришедших данных, в данном случаи это network_type_connect и другие...*/       
         switch( type_event ) {
            case network_type_connect://если игрок вошёл...
               var socket = ds_map_find_value( async_load , "socket" );//получаем его сокет
               var socketip_news = ds_map_find_value( async_load , "ip" );//получаем айпи пользователя
               if(ds_map_exists(SocketIp, socketip_news)){//если на сервере есть игрок с таким айпи, то...               
                  network_destroy(socket);//отключаем зашедшего от сервера
               }else{//иначе
                  ds_map_add(SocketIp, socketip_news, socket);//заносим новый айпи в словарь
                  ds_list_add( SocketList , socket );//заносим новый сокет в наш лист
               }
            break;
            case network_type_disconnect://если игрок вышел...
              var socket = ds_map_find_value( async_load , "socket" );
              var socketip = ds_map_find_value( async_load , "ip" );
              var findsocket = ds_list_find_index( SocketList , socket );//получаем индекс сокета из нашего списка который пришёл
              if ( findsocket >= 0 ) {//если есть...
                  ds_list_delete( SocketList , findsocket );//удаляем
                  ds_map_delete(SocketIp, socketip);//удаляем айпи из словаря
              }
            break;
            case network_type_data://если пришли данные...
               var buffer = ds_map_find_value( async_load , "buffer" );//получаем буффер
               var socket = ds_map_find_value( async_load , "id" );//получаем айди сокета
               buffer_seek( buffer , buffer_seek_start , 0 );/*ставим курсор в начало буфера(буффер, отсчитывать с начала буффера, отступаем с начала 0 знаком)*/
               ReceivedPacket( buffer , socket );//скрипт который принимает два аргумента, сейчас займёмся...
            break;
         }

И в СЕРВЕР в obj_controller в Create дописываем строчку:
Код

SocketIp=ds_map_create();//карта(словарь) с айпи пользователей

Объясняю что мы сделали, если это не понятно, при заходи на сервер каждый игрок проверятся, нету ли на сервере игрока с таким же айпи, и если такой игрок есть, то просто отключаем зашедшего игрока от сервера, тем самым освобождая место для других игроков, иначе вносим этого игрока с его айпи в лист с сокетами и словарь с айпи. За всё это отвечают строчки
Код
var socketip_news = ds_map_find_value( async_load , "ip" );
               if(ds_map_exists(SocketIp, socketip_news)){               
                  network_destroy(socket);
               }else{
                  ds_map_add(SocketIp, socketip_news, socket);
                  ds_list_add( SocketList , socket );//заносим новый сокет в наш лист
               }

Если вы запустите на своём компьютере два клиента, и присоединитесь к серверу, то последний клиент разумеется отключиться, что не нужно при тестирование, поэтому закомментируем эти строчки так:
Код

var socketip_news = ds_map_find_value( async_load , "ip" );
               /*if(ds_map_exists(SocketIp, socketip_news)){               
                  network_destroy(socket);
               }else{*/
                  ds_map_add(SocketIp, socketip_news, socket);
                  ds_list_add( SocketList , socket );//заносим новый сокет в наш лист
               //}

Думаю такой простой защиты хватит для небольшого проекта.:) В отключение пользователя от сервера думаю тоже всё понятно. Не забудьте в СЕРВЕР в obj_controller в Game End добавить строчку:
Код
ds_map_destroy( SocketIp );//удалить словарь с айпи пользователей


СЕРВЕР: В obj_player в collision с obj_bullet:
Код

if(other.idd!=idd){//если присвоенный айди пули не равен присвоенному айди нашего игрока
          hp-=10//отнимаем 10 hp
          buffer_seek( obj_controller.Buffer , buffer_seek_start , 0 );
          buffer_write( obj_controller.Buffer , buffer_u8 , 6 );
          buffer_write( obj_controller.Buffer , buffer_s32, idd);
          buffer_write( obj_controller.Buffer , buffer_u16, hp);
          Send_to_all();//отсылаем всем клиентам новые жизни у этого игрока
}


В сервере и в клиенте в obj_bullet в collision с obj_player:
Код

if(other.idd!=idd){//если присвоенный айди игрока не равен присвоенному айди пули, то...
          instance_destroy()//уничтожаем эту пулю при столкновение с игроком
}


В сервере и в клиенте в obj_bullet в Other в Outside Room перетаскиваем иконку уничтожения объекта(instance destroy) из вкладки main1.

Отложим пока что наш сервер, и займёмся клиентом.
КЛИЕНТ: В obj_player в step заменяем код на:
Код

image_angle=direction
if(idd!=global.myid){exit;}/*если айди игрока не равен нашему айди клиента(см. 1 часть), то прекращаем выполнение кода, сделано для того что бы мы не могли управлять всеми объектами.*/
direction=point_direction(x,y,mouse_x,mouse_y);
if(keyboard_check(ord("A"))){x-=4}
if(keyboard_check(ord("D"))){x+=4}
if(keyboard_check(ord("W"))){y-=4}
if(keyboard_check(ord("S"))){y+=4}
buffer_seek( obj_controller.Buffer , buffer_seek_start , 0 );
buffer_write( obj_controller.Buffer , buffer_u8 , 2 );
buffer_write( obj_controller.Buffer , buffer_s32 , idd );
buffer_write( obj_controller.Buffer , buffer_u16 , direction );
buffer_write( obj_controller.Buffer , buffer_f32 , x );
buffer_write( obj_controller.Buffer , buffer_f32 , y );
network_send_packet( obj_controller.Socket , obj_controller.Buffer , buffer_tell( obj_controller.Buffer ) );/*отправляем на сервер буффер с направлением, координатами и айди игрока.*/

if(keyboard_check_released(ord("E"))){
          buffer_seek( obj_controller.Buffer , buffer_seek_start , 0 );
          buffer_write( obj_controller.Buffer , buffer_u8 , 3 );
          buffer_write( obj_controller.Buffer , buffer_s32 , idd );
          network_send_packet( obj_controller.Socket , obj_controller.Buffer , buffer_tell( obj_controller.Buffer ) );/*отправляем на сервер буффер с айди игрока(уникальный айди 3 будет отвечать за то, что этот скрипт отвечает за стрельбу)*/
}


Ну вот подготовка в принципе и закончена, теперь приступаем к самому сложному, где главное не запутаться.
Открываем в СЕРВЕР скрипт ReceivedPacket, и заменяем всё на следующий код... Не знаю как тут всё объяснить, поэтому просто прокомментирую...
Код

var buffer = argument[ 0 ];//всё понятно
var socket = argument[ 1 ];
         var msgid = buffer_read( buffer , buffer_u8 );//читаем из buffer байт, который может быть от 0 до 255
         switch( msgid ) {
            case 1://если байт который мы прочитали равен 1(то есть когда игрок зашёл на сервер), то...
              with(obj_player){//каждый игрок который есть на сервере...
                  buffer_seek( obj_controller.Buffer , buffer_seek_start , 0 );
                  buffer_write( obj_controller.Buffer , buffer_u8 , 4 );
                  buffer_write( obj_controller.Buffer , buffer_s32, idd);
                  buffer_write( obj_controller.Buffer , buffer_u16, image_index);
                  buffer_write( obj_controller.Buffer , buffer_u16,  hp);
                  network_send_packet( socket , obj_controller.Buffer , buffer_tell( obj_controller.Buffer ) );/*отсылает зашедшему игроку буффер со своим уникальным айди, присвоенным айди, жизнями и кадром*/
              }
              global.max_players+=1//всего игроков было на сервере увеличиваем на один
              players=instance_create(96,96,obj_player);//создаём объект нового игрока
              players.idd=global.max_players;/*это самое главное, присваиваем объекту нового игрока его уникальный айди(это и есть присвоенный айди)*/
              players.hp=100//ставим объекту жизни
              players.image_index=irandom(1);//ставим объекту случайный кадр
              buffer_seek( Buffer , buffer_seek_start , 0 );//чистим буффер
              buffer_write( Buffer , buffer_u8 , 1 );/*записываем в Buffer значение 1(значение должно быть уникальным для разных данных, допустим что бы отправить координаты надо будет писать 2, а что бы получить ник игрока 3 и т.д) и указываем что оно от 0 до 255 (ниже приведу таблицу из справки GM:S)*/
              buffer_write( Buffer , buffer_u16,  global.max_players);//записываем уникальный айди для клиента в будущем
              buffer_write( Buffer , buffer_f32,  players.x);
              buffer_write( Buffer , buffer_f32,  players.y);
              buffer_write( Buffer , buffer_u16,  players.image_index);
              buffer_write( Buffer , buffer_u16,  players.hp);
              network_send_packet( socket , Buffer , buffer_tell( Buffer ) );/*отправляем буффер клиенту который послал запрос на получение этих данных (собственно сам игрок, буффер, размер отправляемого буффера). Отправляет клиенту уникальный айди, позицию, кадр, жизни*/
              buffer_seek( Buffer , buffer_seek_start , 0 );//чистим буффер
              buffer_write( Buffer , buffer_u8 , 5 );
              buffer_write( Buffer , buffer_s32,  global.max_players);
              buffer_write( Buffer , buffer_u16,  players.image_index);
              buffer_write( Buffer , buffer_u16,  players.hp);
              Send_to_all();//отправляем всем игрокам информацию о новом игроке
            break;
            case 2://отвечает за передвижение объектов
              var idd_player=buffer_read( buffer , buffer_s32 );//получаем айди из буффера который пришёл от клиента(от того который нажал клавишу)
              var img_angle=buffer_read( buffer , buffer_u16 );//поворот
              var xx=buffer_read( buffer , buffer_f32 );//позицию
              var yy=buffer_read( buffer , buffer_f32 );//позицию
              with(obj_player){
                  if(idd=idd_player){//если присвоенный айди объекта равен пришедшему айди от клиента, то...
                      direction=img_angle;//присваиваем поворот
                      x=xx;//позицию
                      y=yy;//позицию
                      buffer_seek( other.Buffer , buffer_seek_start , 0 );
                      buffer_write( other.Buffer , buffer_u8 , 2 );
                      buffer_write( other.Buffer , buffer_s32,  idd);
                      buffer_write( other.Buffer , buffer_u16,  direction);                      
                      buffer_write( other.Buffer , buffer_f32,  x);
                      buffer_write( other.Buffer , buffer_f32,  y);
                      Send_to_all();//отсылаем всем клиентам информацию о том, что игрок двинулся
                  }
              }
            break;
            case 3://отвечает за стрельбу
              var bullet_idd=buffer_read( buffer , buffer_s32 );
              with(obj_player){
                  if(idd=bullet_idd){//если присвоенный айди равен пришедшему айди, то...
                      bullet=instance_create(x,y,obj_bullet);//создаём пулю
                      bullet.idd=idd;//присваиваем пули пришедший присвоенный айди
                      bullet.speed=10;//устанавливаем пули скорость
                      bullet.direction=direction;//устанавливаем направление
                      buffer_seek( other.Buffer , buffer_seek_start , 0 );
                      buffer_write( other.Buffer , buffer_u8 , 3 );
                      buffer_write( other.Buffer , buffer_s32,  bullet.idd);
                      buffer_write( other.Buffer , buffer_u16,  direction);                      
                      buffer_write( other.Buffer , buffer_u16,  bullet.speed);
                      Send_to_all();//отсылаем информацию о пули всем игрокам, даже тому который послал нам данные
                  }       
              }         
            break;
         }


Хух, с сервером разобрались... Теперь приступаем к клиенту... Там тоже есть такой скриптик и он тоже объёмный... facepalm

Открываем в КЛИЕНТ скрипт ReceivedPacket, и заменяем всё на следующий код...
Код

         var buffer = argument[ 0 ];
         var msgid = buffer_read( buffer , buffer_u8 );
         switch( msgid ) {
            case 1://если мы получили информацию о том, что мы создались на сервере...
               global.myid = buffer_read( buffer , buffer_u16 );//присваиваем нашему клиенту пришедший айди
               player=instance_create(0,0,obj_player);//создаём НАШЕГО игрока
               player.idd=global.myid;/*присваиваем игроку присвоенный на сервере айди(тут буду тоже называть присвоенный айди), и далее присваиваем остальные данные...*/
               player.x=buffer_read( buffer , buffer_f32 );
               player.y=buffer_read( buffer , buffer_f32 );
               player.image_index=buffer_read( buffer , buffer_u16 );
               player.hp=buffer_read( buffer , buffer_u16 );
            break;
            case 2://отвечает за передвижение всех игроков на клиенте...
              var idd_player=buffer_read( buffer , buffer_s32 );
              if(idd_player!=global.myid){/*если пришедший с сервера айди игрока не равен нашему(потому что наш объект мы двигаем клавишами, а не получаем информацию о нём с сервера)*/
              var img_angle=buffer_read( buffer , buffer_u16 );
              var xx=buffer_read( buffer , buffer_f32 );
              var yy=buffer_read( buffer , buffer_f32 );
              with(obj_player){
                  if(idd=idd_player){/*то ищем среди всех объектов игрока у которого присвоенный айди равен пришедшему, и изменяем данные соответственно*/
                      direction=img_angle;
                      x=xx;
                      y=yy;
                  }
              }
              }
            break;
            case 3://отвечает за пули
              var idd_bullet=buffer_read( buffer , buffer_s32 );
              var direction_bullet=buffer_read( buffer , buffer_u16 );              
              var speed_bullet=buffer_read( buffer , buffer_u16 );
              with(obj_player){
                  if(idd=idd_bullet){//если присвоенный айди игрока равен пришедшему, то...
                      bullet=instance_create(x,y,obj_bullet);//создаём пулю у этого игрока и посылаем исходя из информации с сервера...
                      bullet.idd=idd_bullet;
                      bullet.direction=direction_bullet;
                      bullet.speed=speed_bullet;
                  }
              }
            break;
            case 4://отвечает за показ всех игроков, когда мы подключились к серверу...
              players=instance_create(x,y,obj_player);
              players.idd=buffer_read( buffer , buffer_s32 );
              players.image_index=buffer_read( buffer , buffer_u16 );
              players.hp=buffer_read( buffer , buffer_u16 );
            break;
            case 5: //отвечает за показ нашего игрока у других игроков, когда мы подключились к серверу...
              var idd_enemy_player=buffer_read( buffer , buffer_s32 );
              if(idd_enemy_player!=global.myid){//сделано для того что бы мы не появились у самих себя
                  enemy_players=instance_create(x,y,obj_player);
                  enemy_players.idd=idd_enemy_player;
                  enemy_players.image_index=buffer_read( buffer , buffer_u16 );
                  enemy_players.hp=buffer_read( buffer , buffer_u16 );
              }
            break;
            case 6://отвечает за изменение жизней, всё просто, попробуйте сами понять.
              var idd_player=buffer_read( buffer , buffer_s32 );
              var hp_player=buffer_read( buffer , buffer_u16 );
              with(obj_player){
                  if(idd=idd_player){
                      hp=hp_player;
                  }
              }
            break;
         }


Вроде всё, запускаем и тестируем. Если есть предложения или ошибки, или недочёты, или неточности... Пишем! Буду не сильно рад, но всё исправлю.:}
Ссылка на основной сайт с моей статьёй.


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}


Сообщение отредактировал mehanic - Вторник, 28 Июля 2015, 20:31
mehanicДата: Четверг, 09 Июля 2015, 14:01 | Сообщение # 5 | Тема: Мультиплеер GMS(Game Maker Studio networking) 1 часть.
был не раз
Сейчас нет на сайте
Читаем ниже. biggrin

Добавлено (09 июля 2015, 14:01)
---------------------------------------------
Решил переписать эту статью ещё и сюда.:)
2 часть - 3 часть на другом сайте(примеры тут же) - 4 часть на другом сайте(примеры тут же)
Всем привет, если вы знаете больше половины отсюда Справка GAME MAKER онлайн то продолжаем читать, давно хотел написать статью на тему создания мультиплеера в гмс, ДЛЯ ПОЛУПРОФИ, ну вообщем наконец руки до этого дошли... Смотрим и делаем.

Мультиплеер в GMS #1 Основы, сервер и клиент.

Приступаем. В сервере и в клиенте создаём спрайт spr_player в котором будут два квадратика размером 32x32 пикселя залитые красным, а другой зелёным цветом, ставим центр. Теперь создаём объект и в сервере и в клиенте obj_player которому присваиваем созданный раньше спрайт, и объект и в сервере и в клиенте obj_controller в котором будут происходить основные события. sm:cool На всякий случай добавим в наш проект в сервер и в клиент шрифт с диапазоном от 1 до 1105 и назовём его font_text.

Приступаем к самому интересному, кодингу.

СЕРВЕР: obj_controller в Create:
Код
Server = network_create_server( network_socket_tcp , 63258 , 32 );//создаём сам сервер(тип советую использовать как тут, порт, максимум игроков)
Buffer = buffer_create( 1024 , buffer_fixed , 1 );//создание буфера(размер, размер не меняется, тут не знаю...)
SocketList = ds_list_create();//сюда будем заносить всех игроков
global.max_players=0//всего игроков было на сервер


СЕРВЕР: obj_controller в Asynchronouos в Networking:
Код

                var type_event = ds_map_find_value( async_load , "type" );/*получаем тип пришедших данных, в данном случаи это network_type_connect и другие...*/              
                switch( type_event ) {
                   case network_type_connect://если игрок вошёл...
                      var socket = ds_map_find_value( async_load , "socket" );//получаем его сокет
                      ds_list_add( SocketList , socket );//заносим новый сокет в наш лист
                   break;
                   case network_type_disconnect://если игрок вышел...
                      var socket = ds_map_find_value( async_load , "socket" );
                      var findsocket = ds_list_find_index( SocketList , socket );//получаем индекс сокета из нашего списка который пришёл
                        
                      if ( findsocket >= 0 ) {//если есть...
                         ds_list_delete( SocketList , findsocket );//удаляем
                      }
                   break;
                   case network_type_data://если пришли данные...
                      var buffer = ds_map_find_value( async_load , "buffer" );//получаем буффер
                      var socket = ds_map_find_value( async_load , "id" );//получаем айди сокета
                      buffer_seek( buffer , buffer_seek_start , 0 );/*ставим курсор в начало буфера(буффер, отсчитывать с начала буффера, отступаем с начала 0 знаком)*/
                      ReceivedPacket( buffer , socket );//скрипт который принимает два аргумента, сейчас займёмся...
                   break;
                }


СЕРВЕР: Создадим скрипт ReceivedPacket:
Код

                var buffer = argument[ 0 ];//всё понятно
                var socket = argument[ 1 ];
                var msgid = buffer_read( buffer , buffer_u8 );//читаем из buffer байт, который может быть от 0 до 255
                switch( msgid ) {
                   case 1://если байт который мы прочитали равен 1, то...
                      global.max_players+=1//всего игроков было на сервере увеличиваем на один
                      buffer_seek( Buffer , buffer_seek_start , 0 );//уже писал выше
                      buffer_write( Buffer , buffer_u8 , 1 );/*записываем в Buffer значение 1(значение должно быть уникальным для разных данных, допустим что бы отправить координаты надо будет писать 2, а что бы получить ник игрока 3 и т.д) и указываем что оно от 0 до 255 (ниже приведу таблицу из справки GM:S)*/
                      buffer_write( Buffer , buffer_u16,  global.max_players);//записываем уникальный айди для клиента в будущем
                      network_send_packet( socket , Buffer , buffer_tell( Buffer ) );/*отправляем буффер клиенту который послал запрос на получение этих данных (собственно сам игрок, буффер, размер отправляемого буффера). Отправляет клиенту уникальный айди*/
                   break;
                }


Так... выключение сервера...
СЕРВЕР: obj_controller в Other в Game End:
Код

                network_destroy( Server );//собственно выключить наш сервер
                buffer_delete( Buffer );//удалить буффер
                ds_list_destroy( SocketList );//удалить лист с пользователями


Добавим пожалуй немного статистики: количество игроков на сервере, сколько всего было игроков на сервере и был ли создан сервер.
СЕРВЕР: obj_controller в Draw:
Код

                draw_set_font(font_text);
                draw_set_color( c_white );
                draw_text( 16 , 16, "Сервер создан: " + string( Server >= 0 ) );
                draw_text( 16 , 32, "Сейчас на сервере игроков: " + string( ds_list_size( SocketList ) ) );
                draw_text( 16 , 48, "Всего было игроков на сервере: " + string( global.max_players) );


Хух... устал... а мы закончили только сервер... приступаем к клиенту... :facepalm_2:

КЛИЕНТ: obj_controller в Create:
Код

                ip=get_string("Айпи: ","127.0.0.1");
                Socket = network_create_socket( network_socket_tcp );//создаём наш сокет
                isConnected = network_connect( Socket , ip , 63258 );//подключаемся к серверу
                Buffer = buffer_create( 1024 , buffer_fixed , 1 );//уже проходили.:)
                global.myid=0//наш уникальный в будущем айди клиента
                alarm[0]=2//надо ставить, что бы работало.:)
                Result=0//проверка на подсоединение к серверу


КЛИЕНТ: obj_controller в Alarm0:
Код

                 buffer_seek( Buffer , buffer_seek_start , 0 );
                 buffer_write( Buffer , buffer_u8 , 1 );//записываем в буфер, тут уникальный айди(значение) тоже один, так как отсылаем уже серверу
                 Result = network_send_packet( Socket , Buffer , buffer_tell( Buffer ) );/*отсылаем информацию серверу, что бы он прислал нам наш уникальный айди.*/


КЛИЕНТ: obj_controller в Asynchronouos в Networking:
Код

var type_event = ds_map_find_value( async_load , "type" );
                switch( type_event ) {
                   case network_type_data:
                      var buffer = ds_map_find_value( async_load , "buffer" );
                      buffer_seek( buffer , buffer_seek_start , 0 );
                      ReceivedPacket( buffer );
                   break;
                }


КЛИЕНТ: Создадим скрипт ReceivedPacket:
Код

//получаем и присваиваем наш уникальный айди
                var buffer = argument[ 0 ];
                var msgid = buffer_read( buffer , buffer_u8 );
                switch( msgid ) {
                   case 1:
                      global.myid = buffer_read( buffer , buffer_u16 );
                   break;
                }


Конец игры...
КЛИЕНТ: obj_controller в Other в Game End:
Код

                network_destroy( Socket );
                buffer_delete( Buffer );


Создался ли клиент выводим информацию...
КЛИЕНТ: obj_controller в Draw:
Код

               draw_set_font(font_text)
               draw_set_color(c_white);
               draw_text(16, 16, "Присоединён: " + string( Result >= 0 ) );
               draw_text(16, 32, "Мой айди: "+string(global.myid))


buffer_u8 - положительные числа от 0 до 255
buffer_s8 - число от -128 до 127
buffer_u16 - положительные числа от 0 до 65535
buffer_s16 - число от -32768 до 32767
buffer_u32 - положительные числа от 0 до 4294967295
buffer_s32 - число от -2147483648 до 2147483647
buffer_f32 - число от -16777216 до 16777216 с плавающей запятой(например число 643,32)
buffer_f64 - число с плавающей запятой от -(2^52) до (2^52)-1
buffer_bool - логическое значение, может быть только 1 или 0 (истина или ложь)
buffer_string - текстовая строка не ограниченная размером бит

Создаём комнаты на сервере и клиенте под названием Test_Room, ставим размеры 480х480 и ставим в них объект obj_controller.
ТЕСТИРУЕМ!!!

Пишем недочёты, ошибки, и стоит ли продолжать... А то замучался. sm:) Насчёт obj_player не беспокоимся... просто на дальнейший урок сделали, если вам он будет нужен.;] Может кому-то да понадобится такое.:) если нужно ещё больше помощи, смотрим небольшая справка по GM:S networking

P.s. За основу взял какой-то пример который нашёл... забыл где, что бы всё не переписывать.Х) Но вроде авторские права не нарушает...


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}


Сообщение отредактировал mehanic - Вторник, 28 Июля 2015, 20:30
mehanicДата: Воскресенье, 22 Июня 2014, 16:10 | Сообщение # 6 | Тема: Ship in Space [ANDROID, 2D]
был не раз
Сейчас нет на сайте
Цитата Хлоя ()
ты сам посмотри на свои скриншоты, они тебе нравятся?

Разумеется нет, но если я начну их улучшать, то боюсь это будет ещё хуже.

Цитата ustance ()
Не думаю, что своё творчество кому-то вообще нравится. Из-за этого игры не делать? :I

Как же правильно сказано.:3

Добавлено (17.06.2014, 07:45)
---------------------------------------------
Как вам новая графика?
Проголосуйте пожалуйста в опросе!

Ссылка на опрос: Опрос

P.s. Если не трудно, скажите что можно улучшить?
happy

Добавлено (22.06.2014, 16:10)
---------------------------------------------
Новая версия 1.1.0 ShipinSpace уже в Google Play! Качайте, играйте, выполняйте цели!

Что нового:
- Начало работы над перерисовкой графики-интерфейса.
- Добавлены звуки.
- Возможность отключения музыки.
- Добавлена кнопка "выход".
- И ещё несколько незначительных изменений/улучшений.

P.s. Если вдруг у вас появляется несколько кнопок инвентаря, нажмите в меню на "Сбросить результат", не знаю почему такое происходит.:)

Скачать с Google Play


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}


Сообщение отредактировал mehanic - Вторник, 17 Июня 2014, 07:45
mehanicДата: Вторник, 17 Июня 2014, 08:03 | Сообщение # 7 | Тема: Logical Dungeon [2D] - TBS
был не раз
Сейчас нет на сайте
Вполне весёлая игра. smile
Неплохо было бы увеличить скорость анимации.
Если начал рисовать в пиксельном стиле, то не надо добавлять качественные изображения.(например лестница)
За место пола, можно сделать какие нибудь разноцветные пиксели... На стенах тоже стоило бы добавить узоры.
Не совсем понял что за кружочки между стенок... wacko

_________________
Удачи в разработки.


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Понедельник, 16 Июня 2014, 14:55 | Сообщение # 8 | Тема: [2D] MasterColor
был не раз
Сейчас нет на сайте
Цитата HaGe ()
1. убери встроенную таблицу рекордов. заклебало чистить реестр от поделок на gm. я не люблю грязь
2. управление неудобное. интуитивно понятное, но неудобное.
3. почему после проигрыша игра закрывается? =(

Всё правильно написано.

Цитата SpeRdKeaR ()
Лазеры и Щит (защита от стреляющих сверху лазеров)

Пусть они тоже цветами разными стреляют, и действуют так же, как препятствия:3

Ещё бы можно было, СИЛЬНО уменьшить скорость в игре. Слишком быстро бежит человечек... Не успеваешь.
Добавь полоску жизней что ли, а то каждый раз бегать по 1 разу... не интересно.


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Понедельник, 16 Июня 2014, 08:54 | Сообщение # 9 | Тема: Активация и деактивация объекта.
был не раз
Сейчас нет на сайте
Fоzzie, Как то так...

Пример


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Воскресенье, 15 Июня 2014, 19:08 | Сообщение # 10 | Тема: [2D] MasterColor
был не раз
Сейчас нет на сайте
Я бы поиграл, особенно на телефоне.:)
Было бы не плохо, если бы:
- Игрок бежал быстрее, в зависимости от пройденного расстояния.
- В полу были тоже небольшие дыры, или какие нибудь объекты, которые тоже надо миновать с помощью смены цвета.
- В некоторых местах надо было бы менять цвет несколько раз, то есть бежишь, появляется какой нибудь быстро меняющий цвет объект, и тебе надо нажимать быстро на экран допустим, при этом прибавляются очки.

_________________
Удачи в разработки.


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Суббота, 14 Июня 2014, 11:32 | Сообщение # 11 | Тема: Ship in Space [ANDROID, 2D]
был не раз
Сейчас нет на сайте
StupidNickName, Знаю, у меня нет ни дизайнера, ни художника... Всё сам.
А найти их(художников, дизайнеров)... ну и заставить работать ещё та проблема...


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Суббота, 14 Июня 2014, 10:41 | Сообщение # 12 | Тема: Ship in Space [ANDROID, 2D]
был не раз
Сейчас нет на сайте
Цитата EchoIT ()
они не грузятся

Зайдите по ссылки Google Play которую я выложил.
wacko


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Суббота, 14 Июня 2014, 10:37 | Сообщение # 13 | Тема: Ship in Space [ANDROID, 2D]
был не раз
Сейчас нет на сайте
Цитата EchoIT ()
нормальными фотохостингами

А чем плох данный вариант?
Картинки достаточно в большом размере, по желанию их можно свернуть, развернуть.


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}
mehanicДата: Суббота, 14 Июня 2014, 10:13 | Сообщение # 14 | Тема: Ship in Space [ANDROID, 2D]
был не раз
Сейчас нет на сайте
Жанр игры: Экономическая стратегия.
В каком пространстве: 2D.
Вид в игре: Сверху.
Движок: GMS(Game Maker Studio).
Версия: 1.1.0.

Ship in space - космическая игра на 2D карте для ANDROID.
Бороздите просторы космоса на своём космическом корабле, воюя с врагами и пытаясь выжить в суровых условиях космоса.

В этой игре вас ждёт:
- Более 15 кораблей с возможностью прокачки;
- Торговля с союзниками;
- Множество разнообразных планет, которые можно захватить;
- Умные, коварные и непредсказуемые враги;
- Космические сражения и масштабные баталии;
- Множество разнообразных ресурсов и бонусов;
- И ещё многое другое!

Скачать игру: Google Play
Группа ВКонтакте: Mini Self Studio


_____________________________________________________________
Выполните все цели, и станьте абсолютным повелителем космоса!

smile


http://forum.hellroom.ru/index.php?topic=21720
Мультиплеер GMS(Game Maker Studio networking) туториал на русском создание игры:}


Сообщение отредактировал mehanic - Воскресенье, 22 Июня 2014, 16:14
  • Страница 1 из 1
  • 1
Поиск:

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