Я делаю движок для своей 2D-игры с видом сверху, но застрял, пытаясь решить следующую проблему:
- Игрок может перемещаться с помощью клавиш со стрелками, которые ускоряют вас в соответствующих направлениях. Существует трение, поэтому вы перестаете двигаться после отпускания клавиш, хотя и не сразу.
- Когда вы удерживаете две перпендикулярные клавиши, вы ускоряетесь в этом направлении на 45 ° с той же скоростью, что и на одной оси.
- Существует максимальная скорость, выше которой вы не можете ускориться при ходьбе, очевидно, что это также ограничивает вашу максимальную скорость ходьбы. Вы можете быть сбиты с толку и тем самым превысить эту скорость.
- Если вы двигаетесь быстрее макс. walkpeed, вы можете замедлиться быстрее, если будете удерживать клавиши в противоположном (-ых) направлении (-ях)
Псевдокод для первой точки, без трения:
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 влево и начинали нажимать вниз, движение направление не изменилось или почти не изменилось.
Затем я начал думать о многочисленных продуктах, различиях и других вещах с векторами, но в основном я не мог больше следить за ними или столкнулся с ранними проблемами.
Итак, в заключение, может ли кто-нибудь объяснить систему, которая соответствует всем вышеперечисленным пунктам, или указать на статью, в которой объясняется, как такая система может быть реализована? Не беспокойтесь о том, чтобы предложить что-то сложное, я могу понять даже сложные концепции через некоторое время.
Спасибо за вашу помощь!