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