Я создаю простую гоночную игру (космические корабли, без гравитации), используя p2.js, phaser и node.js.
Что я сделал: Клиент получает состояние мира с сервера:
- экстраполировать других игроков на основе последней скорости / позиции с сервера
- проверьте правильность предсказания на стороне клиента - если не применимо положение с сервера и обработайте входные данные, о которых сервер не знал.
- фиксированный шаг физики
Сервер:
- получает отзывы от клиентов и подает заявку
- фиксированный шаг физики
- отправляет состояние мира каждому клиенту
Сейчас я борюсь со столкновениями между игроками. Столкнувшийся игрок все время прыгает во время столкновения. Я думаю, это потому, что предсказание на стороне клиента не рассчитывает результаты, аналогичные серверным.
Сервер не знает все входные данные от игрока (лаг).
Игрок не имеет той же позиции сталкивающегося игрока, что и сервер (лаг).
Сочетание этих двух факторов позволяет клиенту разрешать конфликты не так, как на сервере, и когда наступает состояние мира, игрок должен сделать большую поправку.
Ответы:
Заниматься физикой только на сервере. Вот пример рабочего процесса:
источник
Если вы хотите, чтобы взаимодействие с игроком ощущалось мгновенно, тогда есть несколько вариантов. Если нет, то просто делайте физику на стороне сервера.
Вариант 1. Клиентская сторона обнаруживает коллизию, и данные о коллизиях отправляются на сервер и / или напрямую другому клиенту. Определенные многопользовательские шутеры делают такое обнаружение столкновений, потому что в противном случае стрельба не будет точной.
Вариант 2 : на стороне сервера работает физика, но делает много разных прогнозов. Вы можете просто использовать больше экземпляров каждого игрока и предсказывать, что они будут делать немного разные вещи. Убедитесь, что они не конфликтуют друг с другом, и отправьте данные клиентам. Каждый раз, когда движение игрока соответствует прогнозу, вы используете данные, которые уже были отправлены клиенту.
источник