Движение персонажа в координатной плоскости Python
У меня вопрос, для решения которого код не обязателен (напишу сам). Хотя все-же был бы не против примеров. В общем, я делаю 2д игру с видом сверху. И я не знаю как реалитзовать движение под углом (по диагонали). То есть сейчас он, вроде как, приходит в ту точку что мне нужна, но он не делает этого кратчайшим маршрутом. Одно НО, он всетаки может двигаться по диагонали, но только под углом 45 градусов. PS: Поясню, что я хочу узнать как мне считать скорость к отдельным координатным плоскостям, при этом, что-бы общая скорость движения сохранялась.
Вот пример моего кода сейчас:
# Движение к заданным координатам
def directional_movement(self, x_cord_direction, y_cord_direction):
while True:
if self.X_Cord != x_cord_direction:
if self.X_Cord < x_cord_direction:
if x_cord_direction - self.X_Cord < self.Move_Speed / 100:
self.X_Cord = x_cord_direction
else:
self.X_Cord += self.Move_Speed / 100
else:
if self.X_Cord - x_cord_direction < self.Move_Speed / 100:
self.X_Cord = x_cord_direction
else:
self.X_Cord -= self.Move_Speed / 100
if self.Y_Cord != y_cord_direction:
if self.Y_Cord < y_cord_direction:
if y_cord_direction - self.Y_Cord < self.Move_Speed / 100:
self.Y_Cord = y_cord_direction
else:
self.Y_Cord += self.Move_Speed / 100
else:
if self.Y_Cord - y_cord_direction < self.Move_Speed / 100:
self.Y_Cord = y_cord_direction
else:
self.Y_Cord -= self.Move_Speed / 100
self.move_drawing_hit_box()
if self.X_Cord == x_cord_direction and self.Y_Cord == y_cord_direction:
break
Ответы (1 шт):
Для движения по прямой достаточно будет посчитать угол и расстояние до объекта.
В вашем коде персонаж ходит только по узлам виртуальной сетки размером self.Move_Speed / 100
Кроме того, названия переменных x_cord_direction и y_cord_direction не соответствуют действительности и только вводят в заблуждение. На самом деле это координаты цели в которую должен переместиться объект.
# Движение к заданным координатам
def directional_movement(self, x_target, y_target):
while True:
if self.X_Cord != x_target or self.Y_Cord != y_target:
dx_target = x_target - self.X_Cord
dy_target = y_target - self.Y_Cord
# Направление к цели
direction = math.atan2(dy_target, dx_target)
# Расстояние до цели
distance = math.sqrt(dx**2 + dy**2)
step = self.Move_Speed / 100
if distance < step:
self.X_Cord = x_target
self.Y_Cord = y_target
else:
# Сместить каждую координату на соответствующую составляющую вектора движения в нужную сторону
self.Y_Cord = self.Y_Cord + math.sin(direction) * step
self.X_Cord = self.X_Cord + math.cos(direction) * step
self.move_drawing_hit_box()
if self.X_Cord == x_target and self.Y_Cord == y_target:
break