Необходимо немного изменить позицию в приложении. L oop.
Определить начальную позицию (start
), конечную позицию (end
) и скорость (speed
):
start = 10, 10
end = 40, 40
speed = 1
Инициирование текущей позиции. Вычислить вектор от текущей позиции до конечной позиции (dx
, dy
) в приложении l oop и изменить текущую позицию на скорость в направлении к цели:
pos = start[:]
while run:
# [...]
dx = end[0] - pos[0]
dy = end[1] - pos[1]
dist = math.sqrt(dx*dx + dy*dy)
if dist > speed:
pos = pos[0] + dx*speed/dist, pos[1] + dy*speed/dist
Примечание: math.hypot
вычисляет евклидово расстояние , а (dx/dist, dy/dist)
представляет собой Единичный вектор (единичный вектор имеет длину 1).
Нарисуйте объект в текущей позиции (pos
) в каждом кадре:
pygame.draw.rect(win,(0,0,255),(round(pos[0]), round(pos[1]), width, height))
Если у вас есть список позиций:
x = [60, 140, 140, 60]
y = [60, 140, 60, 140]
Тогда start
и end
должны быть установлены с позиций в списке. Используйте индекс списка current_i
для отслеживания текущей начальной позиции. Увеличьте индекс, если объект достиг текущей целевой позиции (end
).
См. Пример:
import pygame
import math
pygame.init()
win = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
x = [60, 140, 140, 60]
y = [60, 140, 60, 140]
width, height = 10, 10
speed = 1
current_i = 0
pos = x[current_i], y[current_i]
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
start = x[current_i], y[current_i]
end = x[current_i % len(x)], y[current_i % len(y)],
dx = end[0] - pos[0]
dy = end[1] - pos[1]
dist = math.hypot(dx, dy)
if dist > speed:
pos = pos[0] + dx*speed/dist, pos[1] + dy*speed/dist
else:
pos = end[:]
current_i = current_i + 1 if current_i < len(x)-1 else 0
win.fill(0)
pygame.draw.rect(win,(0,0,255),(round(pos[0]), round(pos[1]), width, height))
pygame.display.flip()