Задать вопрос

Как сделать передвижение ботов на node.js, чтобы на клиенте оно плавно отображалось?

На html-странице есть canvas с картой и персонажами на ней. Клиент общается с сервером node.js с помощью сокетов (ws).
Всё, что происходит на карте – контролирует сервер node.js для синхронизации между всеми клиентами. Пока что вся работа сервера сводилась к обработке запроса от клиента и отправке ответа клиенту.

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

Как реализовать это?
Раз во сколько-то миллисекунд запускать цикл по всем ботам, в нём при учёте времени и скорости присваивать боту новую координату и отсылать это всем клиентам? А как тогда плавность этого перемещения сделать на клиенте? Чтобы на клиенте не дёргался?
  • Вопрос задан
  • 208 просмотров
Подписаться 4 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
По идее, боты должны не слишком отличаться от персонажей игроков. Разница только в том, что персонаж двигается сервером по сообщению ws от игрока, а бот - по команде от самого бота, но суть сообщений и команд одна и та же, например, "начать ехать вправо". Ну а сервер должен сразу присылать игроку изменившиеся координаты тех или иных объектов.

ботам периодически, по таймеру, предоставляется возможность оценить ситуацию и "подумать", что дальше делать, и отправить команду в механизм перемещаний.

копия мира на клиенте обновляется по сообщениям ws. Перерисовка - по requestAnimationFrame, где берутся текущие координаты. Обычно такой подход дает плавное движение.

тут есть досадный момент: например, игрок нажимает кнопку-стрелку вправо, но пока об этом дойдет по ws до сервера, пока сервер сдвинет игрока и сообщит об этом обратно на клиента, могут пройти десятки или даже сотни миллисекунд, это будет ощущаться как тормоза. Потому иногда делается "оптимистическое обновление" - на клиенте объект начинает ехать, не дождавшись сообщения от сервера. Выглядит более гладко, но возможен рассинхрон. Так что как лучше, непонятно, обычно это набор компромиссов.
Ответ написан
Ваш ответ на вопрос

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

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