Столкновения между игроками в многопользовательской гоночной игре


8

Я создаю простую гоночную игру (космические корабли, без гравитации), используя p2.js, phaser и node.js.

Что я сделал: Клиент получает состояние мира с сервера:

  • экстраполировать других игроков на основе последней скорости / позиции с сервера
  • проверьте правильность предсказания на стороне клиента - если не применимо положение с сервера и обработайте входные данные, о которых сервер не знал.
  • фиксированный шаг физики

Сервер:

  • получает отзывы от клиентов и подает заявку
  • фиксированный шаг физики
  • отправляет состояние мира каждому клиенту

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

Сервер не знает все входные данные от игрока (лаг).

Игрок не имеет той же позиции сталкивающегося игрока, что и сервер (лаг).

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


Можно ли увеличить временной шаг на сервере, чтобы было как минимум меньше исправлений? Вы пытались заставить игроков использовать те же данные, что и на сервере (последняя отправленная позиция, а также прогнозная позиция других игроков)?
user3797758

Предложение: Вы пытались заставить только сервер вычислять коллизию? Клиент будет использоваться только для рендеринга и отправки / получения данных (и, конечно, реагировать на любые полученные данные).
Greffin28

Ответы:


1

Заниматься физикой только на сервере. Вот пример рабочего процесса:

  1. Клиент нажимает «держи левее».
  2. Клиент отправляет серверу запрос "оставайся левее"
  3. Сервер получает данные.
  4. Сервер направляет экземпляр клиента на сервер слева.
  5. Сервер обнаруживает столкновение между игроками.
  6. Сервер вносит исправления на основе столкновения.
  7. Сервер отправляет данные о местоположении клиенту.
  8. Клиент получает данные о позиции.
  9. Клиент корректирует свою позицию.

0

Если вы хотите, чтобы взаимодействие с игроком ощущалось мгновенно, тогда есть несколько вариантов. Если нет, то просто делайте физику на стороне сервера.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.