Мультиплеер 2 игрока, сервер и клиент...
|
|
InsDes | Дата: Пятница, 30 Сентября 2011, 21:08 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| В общем с помощью встроенных функций GML хочу сделать мультиплеер на двух игроков. Как я понимаю один пользователь должен будет создать "Сервер", другой к нему подключиться, стать "Клиентом" введя АйПи сервера. Дело в том, что я вовсе не понимаю как происходит связь, передача данных, связывание сервера и клиента и их создание. Может кто может подкинуть простой пример, который может наглядно показать создание сервера, подключение и начало игры???
|
|
| |
LunarPixel | Дата: Пятница, 30 Сентября 2011, 21:13 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Вот, посмотри: http://zalil.ru/31787504 Откопал у себя на компе свой примерчик маленький.
|
|
| |
InsDes | Дата: Пятница, 30 Сентября 2011, 21:34 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| LunarPixel, Спасибо, но почему не получается подключится? Пробовал у себя на компьютере с двумя открытыми *.exe и с другом...
|
|
| |
LunarPixel | Дата: Пятница, 30 Сентября 2011, 21:37 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| InsDes, проверил, всё работает. При подключении на одном компе не надо вводить IP. При подключении через Интернет возможны проблемы со стандартными функциями, нужно в таком случае использовать Хамачи - эмулятор локальной сети.
|
|
| |
InsDes | Дата: Пятница, 30 Сентября 2011, 21:49 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| LunarPixel, А как нежели через интернет? О.о Добавлено (30.09.2011, 21:49) --------------------------------------------- И можно поподробнее про Хамачи?! А так же как происходит передача координат серверу? С помощью какой функции и где её разумно использовать, и соответственно когда?
|
|
| |
LunarPixel | Дата: Пятница, 30 Сентября 2011, 21:50 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| InsDes, ?! Quote (InsDes) у себя на компьютере с двумя открытыми *.exe и с другом...
У себя на компе, при двух открытых exe, не надо вводить IP, или же указывать локальный. Через интернет с другом может не работать на стандартных функциях, потому нужен эмулятор локальной сети.
|
|
| |
InsDes | Дата: Пятница, 30 Сентября 2011, 21:56 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| LunarPixel, Все все, я понял... Эмулятор локальной сети должен стоять только у сервера или и у клиента тоже? И почему "может"? Какие обстоятельства могут служить неработоспособностью стандартных функций... Извини если прям перегрузил вопросами... И если лучше, то может использовать 39dll???
|
|
| |
LunarPixel | Дата: Пятница, 30 Сентября 2011, 22:01 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| InsDes, смотря для каких тебе целей, если просто с другом поиграть во что то простенькое, то можно и на стандартных. Если что то серьезное делаешь, то лучше 39dll. Эмулятор должен стоять у обоих. Он создаст между вами псевдо локальную сеть и выдаст IP по которым и надо будет подключаться. Не работать в Интернете может из за разных причин, но связаны они с провайдером. ) Как правило, если провайдер один и тот же, то можно подключиться. Иначе не получается. Во всяком случае у меня было так.
|
|
| |
InsDes | Дата: Пятница, 30 Сентября 2011, 22:06 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| LunarPixel, Спасибо огромное за объяснение. Я думаю делать обычный логический-платформер построенный на коомперативе, чтобы поиграть с другом. Следовательно можно и на стандартных функциях управится. Теперь о функции передачи координат серверу, как я понял - это mplay_data_read(1) - что является индексом (1) и от чего он зависит?
|
|
| |
LunarPixel | Дата: Пятница, 30 Сентября 2011, 22:11 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| mplay_data - это общий массив, в котором хранятся передаваемые параметры.
mplay_data_write(par,n) - записывает параметр в ячейку n mplay_data_read(n) - считывает параметр из ячейки n
Например у клиента записывается X координата объекта: mplay_data_write(x,0) А на сервере она считывается и присваивается объекту x=mplay_data_read(0)
|
|
| |
InsDes | Дата: Пятница, 30 Сентября 2011, 22:15 | Сообщение # 11 |
почетный гость
Сейчас нет на сайте
| LunarPixel, Просто у меня развилось мнение\ощущение, что например если объект совершил действие (x-=1) то после этой функции нужно вписать функцию, которая передаст информацию серверу, то есть: Если нажата_клавиша('W') {прыжок; передача серверу} Поэтому я слегка не понимаю...
Сообщение отредактировал InsDes - Пятница, 30 Сентября 2011, 22:16 |
|
| |
LunarPixel | Дата: Пятница, 30 Сентября 2011, 22:18 | Сообщение # 12 |
старожил
Сейчас нет на сайте
| можно каждый шаг передавать координаты объект от сервера клиенту и наоборот.
Например, у тебя на клиенте есть obj_hero. На сервере есть obj_hero_clirent
Объекту obj_hero задаешь управление и в step пишешь: mplay_data_write(x,0) mplay_data_write(y,1)
А объекту obj_hero_clirent на сервере в step пишешь: x=mplay_data_read(0) y=mplay_data_read(1)
Таким образом при движении объекта obj_hero на стороне клиента, объект obj_hero_clirent будет двигаться точно так же на стороне сервера.
|
|
| |
AGENTX001 | Дата: Пятница, 30 Сентября 2011, 22:19 | Сообщение # 13 |
почётный гцупер
Сейчас нет на сайте
| InsDes, LunarPixel, лично моё ИМХО 39dll проще=)
|
|
| |
InsDes | Дата: Пятница, 30 Сентября 2011, 22:26 | Сообщение # 14 |
почетный гость
Сейчас нет на сайте
| То есть ...write передает информацию от клиента к серверу, а ...read наоборот, от сервера к клиенту, так???
|
|
| |
LunarPixel | Дата: Пятница, 30 Сентября 2011, 22:29 | Сообщение # 15 |
старожил
Сейчас нет на сайте
| AGENTX001, очень полезная информация, спасибо. Если уж решил написать что то, то укажи хоть в чем принципиальная разница в освоении, в чем простота?!
InsDes, нет. Write записывает информацию в общий массив. А read считывает информацию из общего массива. Разбери пример, перечитай ещё раз что я написал и поэкспериментируй.
От клиента записал данные, на сервере считал. На сервере записал данные, на клиенте считал.
|
|
| |
|
LunarPixel | Дата: Пятница, 30 Сентября 2011, 22:39 | Сообщение # 17 |
старожил
Сейчас нет на сайте
| InsDes, да, всё правильно
|
|
| |
InsDes | Дата: Пятница, 30 Сентября 2011, 22:42 | Сообщение # 18 |
почетный гость
Сейчас нет на сайте
| Теперь же если мне нужно передать угол, как в tds (к примеру), то необходимо: image_angle=point_direction(mplay_data_write(1,x),mplay_data_write(2,x), mouse_x, mouse_y) А у другого считывать в шаге: obj_player1.x=mplay_data_read(1) obj_player1.y=mplay_data_read(2)
Или не верно?
|
|
| |
LunarPixel | Дата: Пятница, 30 Сентября 2011, 22:45 | Сообщение # 19 |
старожил
Сейчас нет на сайте
| InsDes, проще записать угол, как и координаты: mplay_data_write(3,image_angle) И считывать его.
|
|
| |
InsDes | Дата: Пятница, 30 Сентября 2011, 22:46 | Сообщение # 20 |
почетный гость
Сейчас нет на сайте
| LunarPixel, А как быть с переменными?
|
|
| |