Я могу выделить две проблемы. Первая связана с плавным движением, а вторая связана с убеганием персонажа с экрана.
Чтобы создать плавное движение, вы можете использовать технику, называемую линейной интерполяцией или (LERP) для сглаживания движения. В основном, как это работает, между вашей начальной точкой и конечной точкой вы вычисляете набор все меньших расстояний, чтобы имитировать плавное движение и замедление, когда конечная точка почти достигнута.
Простейшим примером этой функции будет:
//point1 is the current position, will be starting position on first call
//point2 is the target position
//epsilon is the % of the distance between current and target you want
//to cover per game physics loop (a fixed realworld time based loop).
//The smaller the % the "smoother" the motion.
float lerp(float point1, float point2, float epsilon)
{
return point1 + epsilon * (point2 - point1);
}
Когда персонаж приближается к пункту 2, он постепенно замедляется. Обратите внимание, что они никогда не будут касаться точки 2, но будут бесконечно близко. Вам необходимо исправить это, и если игрок находится на бесконечно малом расстоянии от точки 2, мы можем считать, что игрок находится в точке 2.
Вторая проблема, о которой вы упомянули, связана с тем, что ваш персонаж летает за кадром. Это результат чтения ввода при каждом обновлении игрового цикла в сочетании с мгновенным перемещением между тайлами.
В идеале, чтобы решить это, в вашем коде вам нужно решить,
- Сколько реального времени потребуется персонажу, чтобы переместиться из пункта 1 в пункт 2.
- Настройте свой Lerp на бег от точки 1 до двух в течение этого времени.
- Прочитайте ввод еще раз, как только точка 2 достигнута, чтобы решить, куда идти