@Dokma

Как сделать игру в реальном времени на laravel?

Нужно сделать игру. Смысл такой, при определенных условиях игра запускается и идет например ровно 49 секунд. За это время пользователи делают разные действия и каждое действие должно показаться всем пользователям. Т.е если один нажал на кнопку, то на страничке у остальных появится такая надпись. Так же на страничке должен идти визуальный таймер и при обновлении странички все должно сохраняться и продолжаться. А когда игра завершится должно выполниться какое-то действие. Так вот вопрос, предложите как это реализовать. Пока придумал так, ларавель получает HTTP от пользователя и передает через Redis на Socket.io, а он уже в браузер. Но не придумал как быть с таймером. Подскажите
  • Вопрос задан
  • 741 просмотр
Пригласить эксперта
Ответы на вопрос 3
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Таймер - на сервере.
Ответ написан
@LiguidCool
Берите Ноду и веб сокеты.
Ответ написан
Комментировать
Мастер-таймер запускается на сервере. Вернее, там отсчитывается время с кторого и до которого идёт приём событий от пользователей.

Для юзера так же важна точность времени. Поэтому на клиенте надо получить точное время окончания игры. Для синхронизации времени клиента с сервером через небыструю, с меняющейся на ходу задержкой, сеть есть протокол синхронизации времени NTP (как работает NTP).

Вам понадобится аналогичный алгоритм, но не устанавливающий системное время на клиенте, а получающий клиентскую дату-время, соотв. моменту окончания счетчика на сервере.

Например, на сервере игра заканчиваются в 12:34:56. Сейчас на сервере время 01:23:45 (предположим, она не 49 с идёт, а гораздо дольше). А на клиенте сейчас 04:21:00. Задача получить время на клиенте, когда на сервере наступит 12:34:56.

Первый ping ушёл с клиента в 04:21:00, и вернулся с серверным временем 01:23:47 через 3 секунды в 04:21:03. Считаем, что ответ сервера пришёлся на середину нашего отреза в 3 секунды. Из этого получаем клиентское время, когда наступит конец игры.

Эти пинги можно повторять снова и снова, уточняя время окончания. А таймер обратного отсчёта запускайте setTimeout'ом в небольшой промежуток меньше секунды, напр. 200ms. И пусть он показывает, сколько осталось до уточнённого момента конца игры.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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