В настоящее время у меня есть что-то вроде:
float deltaX = point0.getX() - point1.getX();
float deltaY = point0.getY() - point1.getY();
И каждые 0,01 секунды я обновляю положение моих объектов следующим образом:
object.setPosition(object.getX()-deltaX/100,object.getY()-deltaY/100);
Так что это перемещает мой объект из точки 0 в точку 1 за 1 секунду. Что мне нужно, так это иметь 2 точки, чтобы иметь возможность перемещать объект из точки 0 в направлении (в направлении) точки 1 с постоянной скоростью. Таким образом, когда у меня есть точка ближе к моей начальной точке, объект будет двигаться к ней с той же скоростью, что и у меня, если у меня будет более удаленная точка. Любые предложения приветствуются. Благодарю.
game-mechanics
movement
Fofole
источник
источник
Ответы:
Я буду использовать некоторые линейные алгебраические структуры, поскольку таким образом описать операции проще. В случае, если вы не знаете, как реализовать эти векторные операции, в конце я дам краткое объяснение.
Допустим, вы начинаете с этих значений:
start
иend
отмечаете конечные точки движения,speed
сколько пикселей должно двигаться в секунду, иelapsed
скорость, с которой вы будете обновлять позицию вашего объекта (некоторые движки уже предоставляют это значение для вас ):Первое, что вы хотите вычислить, это расстояние между обеими точками и нормализованный вектор, содержащий направление от начала до конца. Также вы должны «привязать» положение объекта к
start
точке. Этот шаг выполняется только один раз, в начале:Затем на вашем методе обновления, вы перемещаете объект, добавив умножение
direction
,speed
иelapsed
его позиции. После этого, чтобы проверить , если движение закончится, вы видите , если расстояние между начальной точкой и текущим положением объекта является больше , чем начальное расстояние Вы вычислили. Если это так, мы привязываем позицию объекта к конечной точке и прекращаем перемещение объекта:Справочник по быстрым векторным операциям
Представление
Сумма / Вычесть
Умножить на Скаляр (float)
Длина / Расстояние
Нормализовать
Этого должно быть достаточно для преобразования приведенного выше кода в обычные операции, если у вас нет
Vector
класса, доступного для вас.Пример конвертации
источник
Vector2 start;
становитсяfloat startX, startY;
. И вы можете легко рассчитать расстояние вручную, как я объясню в конце. То естьfloat dX = bX - aX; float dY = bY - aY; float distance = Math.sqrt(dx*dx+dy*dy);
.Создайте Вектор и нормализуйте его. Внимание, впереди некоторый псевдокод с неправильными номерами:
Это даст вам такой вектор:
Теперь нормализуйте вектор, и вы получите это :
Отсюда это то же движение, что и с вашей дельтой.
источник
Скопировано и вставлено из моего ответа на: Получите очки на линии между двумя точками
В псевдокоде:
источник