Добавление «скорости» к функции «MoveTowards (начало, цель)» - PullRequest
0 голосов
/ 13 июня 2018

Я реализовал следующую функцию:

function moveTowards(start, target, speed) {
    if (Math.abs(target.x - start.x) < config.COLLISION_RADIUS
        && Math.abs(target.y - start.y) < config.COLLISION_RADIUS) { 
        return target 
    }
    const newX = target.x - start.x
    const newY = target.y - start.y
    const angle = Math.atan2(newY, newX)
    const x = speed * Math.cos(angle)
    const y = speed * Math.sin(angle)

    return {
        x: start.x + x,
        y: start.y + y
    }
}

Ожидается, что он будет вызван в цикле обновления игр и возвращает позицию, которая медленно перемещается к целевой позиции.

Работает нормально, однако, когда я устанавливаю скорость больше 1, функция фактически никогда не достигает целевой позиции, но возвращает позиции в области вокруг цели.

Я взял отсюда математику: https://stackoverflow.com/a/20762210/5547718

Решения там не содержат параметр скорости, а скорее «величину».

Как я могу реализовать переменную скорость, не достигая цели?

(Я пытался просто принимать значения, которые «достаточно близки», но чем больше скорость, тем более высокие различия, которые я должен допускать, которыене получается практически)

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Ваш код выполняет много ненужных вычислений в каждом кадре.Например, у вас должны быть только эти расчеты:

const angle = Math.atan2(newY, newX);
const x = speed * Math.cos(angle);
const y = speed * Math.sin(angle);

Совершено один раз в начале движения, в отличие от каждого отдельного кадра (угол между кадрами не меняется).

Однако каждый кадр может иметь возможность проверить, меньше ли расстояние от начала до цели, чем проецируемое расстояние со скоростью, и в этом случае просто поместите объект в целевую позицию.

if (newX <= x && newY <= y) {
    return target;
}
0 голосов
/ 13 июня 2018

Используя советы @ Balazs и @ Michael, я сделал следующее, и это сработало отлично:

function moveTowards(start, target, speed) {
    const newX = target.x - start.x
    const newY = target.y - start.y
    const angle = Math.atan2(newY, newX)
    const x = speed * Math.cos(angle)
    const y = speed * Math.sin(angle)

    if (newX*newX <= x*x && newY*newY <= y*y)
        return target

    return {
        x: start.x + x,
        y: start.y + y
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...