Я создаю многопользовательскую игру, используя сокет io в javascript. В настоящий момент игра отлично работает в стороне от клиентской интерполяции. Прямо сейчас, когда я получаю пакет с сервера, я просто устанавливаю позицию клиентов в позицию, отправленную сервером. Вот что я пытался сделать:
getServerInfo(packet) {
var otherPlayer = players[packet.id]; // GET PLAYER
otherPlayer.setTarget(packet.x, packet.y); // SET TARGET TO MOVE TO
...
}
Итак, я установил позицию Target. И затем в методе "Обновление игроков" я просто сделал это:
var update = function(delta) {
if (x != target.x || y != target.y){
var direction = Math.atan2((target.y - y), (target.x - x));
x += (delta* speed) * Math.cos(direction);
y += (delta* speed) * Math.sin(direction);
var dist = Math.sqrt((x - target.x) * (x - target.x) + (y - target.y)
* (y - target.y));
if (dist < treshhold){
x = target.x;
y = target.y;
}
}
}
Это в основном перемещает игрока в направлении цели с фиксированной скоростью. Проблема в том, что игрок достигает цели до или после того, как следующая информация поступает с сервера.
Изменить: я только что прочитал Gabriel Bambettas Статья по этому вопросу, и он упоминает это:
Скажите, что вы получаете данные о местоположении при t = 1000. Вы уже получили данные при t = 900, поэтому вы знаете, где игрок находился при t = 900 и t = 1000. Таким образом, из t = 1000 и t = 1100, вы показываете, что сделал другой игрок от t = 900 до t = 1000. Таким образом, вы всегда показываете фактические данные перемещения пользователя, за исключением того, что вы показываете 100 мс "поздно".
Это снова предполагало, что он точно опоздал на 100 мс. Если ваш пинг сильно варьируется, это не сработает.
Вы могли бы предоставить некоторый псевдо-код, чтобы я мог получить Идею о том, как это сделать?
Я нашел этот вопрос в Интернете здесь. Но ни один из ответов не дает пример того, как это сделать, только предложения.