Amatsu, вот немного псевдокода:
Z и X, это локальные координаты. Имеется ввиду что ты делаешь Move уже с учётом поворота объекта.
1. Есть позиция, и ты тупо делаешь:
Z += (keyW - keyS) * moveSpeed;
X += (keyA - keyD) * moveSpeed * strafeSpeed;
Это самый простой и быстрый методе реализации перемещения. С физикой, заместо прибавления к позиции, будет применяться сила воздействия на положение, или можно даже на самом деле тупо менять позицию физ. тела.
2. При корректной реализации:
slowFactor = 0.2f;
if (moved) {
moveVector = new vec2(keyA - keyD,keyW - keyS);
moveVector = Vector.Normalize(moveVector);
speedFactor = Player.SpeedFactor;
} else {
speedFactor *= 0.95f;
}
if (speedFactor > 0.1f) {
moveVector *= speedFactor * (Vector.Dot(moveVector,new vec2(0.0f,1.0f)) * slowFactor + (1.0f - slowFactor));
Z += moveVector.Z;
X += moveVector.X;
}
Тут же у нас сперва указывается параметр slowFactor, чем он больше, тем медленнее будут стрейфы, и ещё медленнее перемещение назад (в данном случае на 40%, учитывая математику выше). Перемещение вперёд будет шустрым - той же скоростью что Player.SpeedFactor.
Далее при условии что мы нажимаем что-то (moved), задаётся вектор (XY), мы его нормализуем. Если игрок не нажал клавиш перемещения, то speedFactor (скорость перемещения) будет снижаться, тут для примера тупо перемножая на 0.95f, что будет весьма плавным (нада с дельтой синхронизировать это изменение).
Далее если скорость будет достаточной, указываем длину вектора исходя из вычислений скорости передвижения, с учётом фактора влияющего на перемещение в разных направлениях как было описано выше относительно slowFactor.
Далее применяем перемещение.
Весьма говнокодно на самом деле, но такое например перемещение, весьма удовлетворительно, если ещё реализовать поворот вектора перемещения, то будет более реальное и плавное перемещение, нежели как щас, при нажатии влево или вправо, будет резко меняться скорость (очень резко), а нада седалть поворот и затухание вектора при повороте в зависимости от разности прошлого и текущего вектора, ещё немного математики. Тогда будет весьма хорошее перемещение, без каких-либо гличей, и по физике.
Но имхо, этот подход всё равно "сразу в лоб", нада делать получше и по уму..