Игрок неправильно передвигается

Я пишу онлайн игру по типу агарио. Код перемещения игрока я сделал таким:

function sq(x) { return x*x; }

var mX = playerMouse.x; // Координаты мышки по X
var mY = playerMouse.y; // Координаты мышки по Y
var mouseAngle = Math.atan2(player.mY, player.mX);
var mouseDist = Math.sqrt(sq(player.mX) + sq(player.mY));
player.vx = (mouseDist / config.maxspeed ) * Math.cos(mouseAngle) / config.maxspeed;
player.vy = (mouseDist / config.maxspeed ) * Math.sin(mouseAngle) / config.maxspeed;

if (player.vx > config.maxspeed) { player.vx = config.maxspeed + (player.vx - Math.floor(player.vx)) }
if (player.vx < -config.maxspeed) { player.vx = -config.maxspeed - (-player.vx + Math.floor(player.vx))}
if (player.vy > config.maxspeed) { player.vy = config.maxspeed + (player.vy - Math.floor(player.vy))}
if (player.vy < -config.maxspeed) { player.vy = -config.maxspeed - (-player.vy + Math.floor(player.vy))}

player.x += player.vx;
player.y += player.vy;

Но он двигается не совсем рядом с мышкой, иногда даже вверх направлен. На скриншоте красным цветом обозначено направление мышки, синим - перемещение игрока. Как это исправить?

Движение игрока


Ответы (1 шт):

Автор решения: MBo

Для вычисления вектора направления между игроком и мышью нужно использовать разности координат, иначе всегда получается направление из начала координат на мышь.

var mX = playerMouse.x - player.x; 
var mY = playerMouse.y - player.y;

Задание скорости в зависимости от расстояния:

speed = min(maxspeed, a * pow(mouseDist, pwr));
player.vx = speed* Math.cos(mouseAngle);
player.vy = speed* Math.sin(mouseAngle);

Здесь a - некий коэффициент. В pow используется нужная степень pwr. Например, для имитации гравитации - pwr = -2.

Если нужна прямая пропорциональность (чем дальше - тем быстрее), то pwr = 1, линейный закон

speed = min(maxspeed, a * mouseDist);

Оценка a - для линейного закона на максимальном расстоянии - скажем, 1000 пикселов, скорость должна быть maxspeed:

maxspeed = a * 1000
1.5 = a * 1000
a = 0.0015
→ Ссылка