Плавное движение в игре на основе плитки

8

Как мы можем заставить нашего персонажа плавно перемещаться по плиткам? Он двигает плитку за плиткой, но это выглядит непрофессионально. Кроме того, когда вы удерживаете клавиши со стрелками, он перемещается по экрану. Как мы можем предотвратить это?

leo882
источник
Вы используете целые числа для движения игрока. Попробуйте вместо этого использовать поплавки.
Мокоша
1
Лучше всего, если вы уменьшите свой код до минимума, необходимого для демонстрации / сообщения вашей проблемы / вопроса. Также вас может заинтересовать этот вопрос .
Kevintodisco
1
Я удалил ненужные части вашего вопроса. Лучше всего добраться до сути и не добавлять дополнительный код или другой пух.
MichaelHouse

Ответы:

6

Плавное движение может быть достигнуто несколькими способами. И это действительно зависит от того, какое движение вы хотите разрешить.

  • Движение по-прежнему ограничено плитками. Этот тип является самым простым для таких вещей, как обнаружение столкновений и другие проверки движения. Для этого типа движения вы будете просто интерполировать позицию во времени при переходе между тайлами. Это может быть так же просто, как добавить что-то вроде следующего в цикл обновления.

Псевдокод:

 if(GetDistance(position, targetposition) > minDistance) {
     position = MoveTowards(position, targetposition, deltatime);
 }

Где MoveTowardsпросто берет текущую позицию и добавляет часть расстояния между ней и целевой позицией.

  • Движение не ограничено плитками. Это становится намного сложнее в реализации. По сути, с помощью этого метода вы просто сохраняете позицию и обновляете ее по скорости. То есть изменение положения со временем.

Удерживание клавиш со стрелками для перемещения символов также может быть реализовано несколькими различными способами. Вероятно, что вы делаете, это что-то вроде:

if(keydown(left))
   tilePosition.X--;

Это действительно заставит персонажа перемещаться по экрану. Так как вы будете обновлять позицию много раз в секунду. Немного лучший способ реализовать это - добавить задержку. Что-то вроде

if(keydown(left)) {
    if(leftKeyHeldTimer > movementDelay) {
        tilePosition.X--;
        leftKeyHeldTimer = 0;
    } else {
        leftKeyHeldTimer+= deltaTime;
    }
}

Это добавит таймер задержки и обновит позицию тайла только после того, как movementDelayзначение будет достигнуто.

MichaelHouse
источник
0

Я могу выделить две проблемы. Первая связана с плавным движением, а вторая связана с убеганием персонажа с экрана.

Чтобы создать плавное движение, вы можете использовать технику, называемую линейной интерполяцией или (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. Сколько реального времени потребуется персонажу, чтобы переместиться из пункта 1 в пункт 2.
  2. Настройте свой Lerp на бег от точки 1 до двух в течение этого времени.
  3. Прочитайте ввод еще раз, как только точка 2 достигнута, чтобы решить, куда идти
Анг Ли
источник