@wolf-9830

Как сделать так чтоб точка двигалась по прямой?

По плану в моей игре игрок должен нажимать на экране и туда должен двигаться персонаж.
Начало координат левый нижний угол с координатами (0:0), а правый верхний угол с координатами (1000:1000). Так вот как сделать так что точка с координатами (x1:x2) двигалась в координаты(x2:x2) по прямой?
  • Вопрос задан
  • 2399 просмотров
Решения вопроса 1
oshikuru
@oshikuru
Python-разработчик, не брезгую js / html / css
// 1 текущая позиция
position_x = 1;
position_y = 2;

// 2 место назначения
destination_x = 2;
destination_y = 2;

// 3 вектор направления
direction_x = destination_x - position_x;
direction_y = destination_y - position_y;

// 4 длина вектора направления
direction_length = sqrt(direction_x * direction_x + direction_y * direction_y)

// 5 нормализованный вектор направления, что бы можно было умножать на скорость
if (direction_length == 0) {
    normalized_direction_x = 0;
    normalized_direction_y = 0;
} else {
    normalized_direction_x = dirextion_x / direction_length;
    normalized_direction_y = direction_y / direction_length;
}

// 6 скорость, например за шаг или секунду
speed = 0.5 

// 7 вектор скорости
velocity_x = normalized_direction_x * speed;
velocity_y = normalized_direction_y * speed;

// 8 следующая точка на которую можно переместиться 
// в принципе, уже ответ на вопрос, но! дальше - лучше
next_position_x += velocity_x
next_position_y += velocity_y

// 9 расстояние от текущей точки до места назначения
to_destination_distance = sqrt((position_x - destination_x)^2 + (position_y - destination_y)^2)

// 10 расстояние от текущей точки до следующей точки
to_next_position_distance = sqrt((position_x - next_position_x)^2 + (position_y - next_position_y)^2)

// 11 сравниваем, если до места назначения ближе чем до следующего шага:
// ==с========n==
// ==c=====d=====
// то двигать только до места назначения, не дальше
if (to_destination_distance <= to_next_position_distance) {
    position_x = destination_x
    position_y = destination_y
} else {
    position_x = next_position_x
    position_y = next_position_y
}

// пункты 2-11 повторять до тех пор пока не приедем в место назначения
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mamkaololosha
dir = (pos2 - pos1).norm
vel = dir * vel_scalar
p = p0 + vel*dt
это если в лоб
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы