Я делаю движок для своей 2D-игры сверху вниз, но я застрял, пытаясь решить следующую проблему:
- Игрок может двигаться с помощью клавиш со стрелками, которые ускоряют вас всоответствующие направления.Существует трение, поэтому вы перестаете двигаться после отпускания клавиш, но не мгновенно.
- Когда вы держите две перпендикулярные клавиши, вы ускоряетесь в этом направлении на 45 ° с той же скоростью, что и на одной оси
- Существует максимальная скорость, которую вы не можете ускорить при ходьбе , это также ограничивает вашу максимальную скорость ходьбы, очевидно.Однако вы можете быть сбиты с ног и, таким образом, превысить эту скорость.
- Если вы двигаетесь быстрее, чем макс.ходьба, вы можете замедлиться быстрее, если удерживать клавиши в противоположном направлении (ах)
псевдокод для первой точки, без трения:
gameTick(){
tempX += LeftKeyHeld ? -1 : 0;
tempX += RightKeyHeld ? 1 : 0;
tempY += UpKeyHeld ? -1 : 0;
tempY += DownKeyHeld ? 1 : 0;
ratio = 0.71;
if( |tempX| == |tempY| ) {
tempX =tempX* ratio;
tempY =tempY* ratio;
}
player.x += tempX;
player.y += tempY;
}
Я могу решить трение(получая длину вектора движения, уменьшая ее за счет трения, проецируя ее назад с тем же соотношением x: y), однако я не могу обернуться вокруг, выполняя maxSpeed.
Я попытался решить проблему, не позволяя игроку вообще ходить, когда он выше maxSpeed, но это нарушает пункт 4. Кроме того, у него был неприятный побочный эффект, когда вы двигались с MaxSpeed влево, иначал давить вниз, направление движения не изменилось или почти не изменилось.
Потом я начал думать о многочисленных продуктах, различиях и других вещах с векторами, но я больше не мог следить за ним или столкнулся с раннимпроблемы.
Итак, в заключение, может ли кто-нибудь объяснить систему, которая отвечает всем вышеперечисленным пунктам, или указать на статью, в которой объясняется, как такая система может быть реализована?Не беспокойтесь о том, чтобы предлагать что-то сложное, я могу понять даже сложные концепции, если у вас есть время.
Спасибо за вашу помощь!