@artem_music

Как реализовать мультиплеер на socket.io?

Добрый день, есть вопрос, как организуется поточность в мультиплеерных играх?

Например, есть два танка-объекта, управляемые двумя игроками. Как правильнее и удобнее реализовать мультиплеер? Когда передавать данные о действиях? На данный момент вижу два варианта логики:
  • Навесить обработчики на кнопки клавиатуры - по каждому клику отправлять запрос серверу, который в свою очередь оповестит второго игрока о действиях первого.
  • Проверка позиции всех игроков с определенным временным интервалом - то есть действие инициализируется сервером, а не действиями игрока.


В первом случае экономится трафик: нет действий со стороны игроков - нет трафика. Как сделать правильнее? Толкните пожалуйста в нужном направлении.
  • Вопрос задан
  • 775 просмотров
Решения вопроса 3
lxfr
@lxfr
При каких либо действиях лить данные о состоянии объектов в базу (какую вам виднее), при попадании данных в базу уведомлять всех подключенных клиентов об этих состояниях, на основе этих данных рендерить позиции. Перед сохранением в базу проверять на читы (а может ли такое состояние быть?).

Данные отправлять только при действиях, соответственно.
Ответ написан
begemot_sun
@begemot_sun
Программист в душе.
Делать специализированный сервер.
Внутри него будуте объекты, отвечающие за:
1. Игровую ситуацию на поле (состояние поля).
2. Состояние игроков.

Игроки путем воздействия на объекты из п.2. Заставляют тех производить воздействие на объекты из п.1.
Объекты из п.1. генерируют соответствующие события для объектов из п.2, которые в свою очередь передают изменение своего состояния и состояния игрового поля удаленному клиенту.

Для реализации данной логики идеального подходит Erlang. :)
Ответ написан
norlin
@norlin
я сейчас делаю прототип игры, используя следующую логику:
1. всё состояние игры хранится на сервере (положения объектов и т.д.)
2. каждый тик сервер отправляет на клиент пакет с данными об объектах, которые попадают в поле видимости данного клиента (в зависимости от его местоположения)
3. клиент в свой клиентский тик отрисовывает последние полученные данные
4. клиент слушает команды ввода и моментально отправляет их на сервер
5. сервер двигает объекты в соответствии с получаемыми командами
6. goto п.2

Ключевой момент - клиент не может сообщать серверу изменения состояний объектов. Клиент может сообщать только пользовательский ввод, а уж как на него реагировать – решает сервер.

Порядок пунктов у меня не совсем такой для серверного тика, по факту вот так:
серверный тик:
1. обновление состояния объектов в зависимости от комманд и прочих данных
2. проверка коллизий
3. обновление клиентов
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы