Я рекомендую рассчитать расстояние между ведомым и спрайтом и вектором направления устройства от (follower_x
, follower_y
) до (mainsprite_x
, mainsprite_y
).
Расстояние можно получить вычисляя евклидово расстояние . Pygame предоставляет distance_to()
для этого. Вектор единицы измерения Th может быть вычислен путем деления вектора направления на расстояние или путем нормализации (normalize()
) вектора направления:
target_vector = Vector2(mainsprite_x, mainsprite_y)
follower_vector = Vector2(follower_x, follower_y)
distance = follower_vector.distance_to(target_vector)
direction_vector = target_vector - follower_vector
if distance > 0:
direction_vector /= distance
Теперь вы можете определить точное значение step_distance
и перейдите к следующему направлению спрайта:
if distance > 0:
new_follower_vector = follower_vector + direction_vector * step_distance.
Определите maximum_distance
и minimum_distance
. Минимальное расстояние шага:
min_step = max(0, distance - maximum_distance)
Максимальное расстояние шага
max_step = distance - minimum_distance
Соберите все вместе:
minimum_distance = ???
maximum_distance = ???
target_vector = Vector2(mainsprite_x, mainsprite_y)
follower_vector = Vector2(follower_x, follower_y)
new_follower_vector = Vector2(follower_x, follower_y)
distance = follower_vector.distance_to(target_vector)
if distance > minimum_distance:
direction_vector = (target_vector - follower_vector) / distance
min_step = max(0, distance - maximum_distance)
max_step = distance - minimum_distance
step_distance = min_step + (max_step - min_step) * LERP_FACTOR
new_follower_vector = follower_vector + direction_vector * step_distance
См. Пример:
![](https://i.stack.imgur.com/9HL3b.gif)
import pygame
LERP_FACTOR = 0.05
minimum_distance = 25
maximum_distance = 100
def FollowMe(pops, fpos):
target_vector = pygame.math.Vector2(*pops)
follower_vector = pygame.math.Vector2(*fpos)
new_follower_vector = pygame.math.Vector2(*fpos)
distance = follower_vector.distance_to(target_vector)
if distance > minimum_distance:
direction_vector = (target_vector - follower_vector) / distance
min_step = max(0, distance - maximum_distance)
max_step = distance - minimum_distance
step_distance = min_step + (max_step - min_step) * LERP_FACTOR
new_follower_vector = follower_vector + direction_vector * step_distance
return (new_follower_vector.x, new_follower_vector.y)
pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
follower = (100, 100)
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
player = pygame.mouse.get_pos()
follower = FollowMe(player, follower)
window.fill(0)
pygame.draw.circle(window, (0, 0, 255), player, 10)
pygame.draw.circle(window, (255, 0, 0), (round(follower[0]), round(follower[1])), 10)
pygame.display.flip()