Подтвердить что ты не робот

Как использовать websockets для игр в реальном времени

Я хочу создать игру с двумя игроками в понг, в которой используются веб-порты и node.js-сервер. socket.io используется как на клиенте, так и на сервере. До сих пор мой единственный опыт заключается в создании чат-приложения.

Это моя первая попытка многопользовательской игры, поэтому я не очень хорошо знаком с сетевыми играми. Если сервер отслеживает:

  • Каждая позиция, в которой находится мяч, и как часто или когда?
  • Движение игрока, игрок перемещается влево или вправо, что, если я нажму и удерживаю некоторое время, как я могу справиться с этим? Должен ли я отправлять как pressHoldStartPosition и pressHoldStopPosition? Я думаю, это легко, если я разрешаю только нажатие, но не удержание.

Мои мысли:

  • Когда мяч попадает на игрока, клиент вычисляет скорость, начальную и конечную позицию, а другой клиент должен выполнить соответствующую анимацию.
  • Не знаю.
4b9b3361

Ответ 1

  • Клиенты рассчитывают - ничего - если вы не хотите, чтобы он предсказал следующий шаг игры * (сервер anwser). Вся игра работает на сервере, который является единственным и заслуживающим доверия источником данных и вычислений. В понг-играх, где есть менее 10 объектов, вы можете отправлять данные довольно часто (интервал 50 мсек.). Для шара я послал [x, y, скорость или угол] для весла [x, y]. Затем интерполируйте (оживить во времени - 50 мс) между старыми (x, y на клиенте) и новыми (x, y, которые вы только что получили с сервера).

  • Не отправляйте миллионные копии проигрывателя - скорее отправляйте по одному пакету каждый период времени (100 мсек.), содержащий информацию, такую ​​как "игрок нажимает" на 100 мс или "позиция игрока" на ( 32, 100), тогда проверить серверную сторону было возможным это перемещение и принять его или отклонить.

Возможно, этот поток поможет вам в вашем приключении:

Многопользовательская игра для JavaScript, построенная с помощью Node.JS - Разделение игроков

[* 1] Предположение - механизм компенсации задержки, который вы можете реализовать позже. В упрощенном виде это означает, что сервер и клиент разделяют некоторые логические коды игры, а когда клиент не имеет текущих данных с сервера, он пытается имитировать то, что происходит в реальной игре.

Ответ 2

Вы найдете книги, книги, об игровых сетях.

В кратком описании, вот что я нашел интересную реализацию: Сервер и клиент вычисляют физику игры. Сервер будет мастером и будет иметь правильное состояние всех объектов, в то время как клиент попытается "предсказать" состояние объектов и сохранить плавную анимацию. Клиент будет периодически обновлять правильное состояние объектов с сервера. В некоторых играх вы можете видеть, что сущности внезапно телепортируются, и это потому, что предсказанная пользователем позиция не соответствует фактической позиции сервера.

Состояние сущности, такое как мяч или игроки, обычно содержит информацию, такую ​​как положение, скорость, состояние кнопки (клавиша вниз/клавиша вверх).

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

Ответ 3

Существует сайт stackexchange, посвященный разработке игры: https://gamedev.stackexchange.com/

Лучшей практикой является только отправка обновлений, о которых должны знать клиенты. Кроме того, как правило, вы отправляете результат действий пользователя, а не сами действия. Вещи, которые можно вычислить (физику), не нужно отправлять, за исключением периодических точек синхронизации для учета ошибок с плавающей запятой, которые накапливают ошибку с течением времени и синхронизируются с удаленными действиями пользователя. Это также делает игру более интерактивной и охватывает некоторые заикания, которые возникают из-за задержек в сети и дрожания.

Основной недостаток этой модели заключается в том, что если у вас высокая латентность сети или падение пакетов, вы получите эффект расходящейся временной шкалы, когда физический расчет будет продолжаться, и вдруг вы получите обновление от удаленного пользователя, указав, что они что-то сделали физикой, с которой мы еще не поймали. Но это стандартная проблема в большинстве сетевых игр, и альтернативы хуже для большинства типов игр в реальном времени.