【问题标题】:Sprite follow another flexible way within certain distance limits [duplicate]精灵在一定距离限制内遵循另一种灵活的方式[重复]
【发布时间】:2020-05-20 17:01:32
【问题描述】:

我正在尝试让精灵遵循另一种精灵灵活的方式。

如果主精灵移动得更快,则跟随者会更落后,如果较慢的跟随者靠近。

运动本身适用于以下(伪)代码:

target_vector = Vector2D(mainsprite_x, mainsprite_y)
follower_vector = Vector2D(follower_x, follower_y)

new_follower_vector = Vector2D.lerp(follower_vector, target_vector, LERP_FACTOR)

目前我一直在为LERP_FACTOR 使用各种常量,这些常量“还可以”。

现在我想添加限制跟随者可以落后多少以及它可以有多接近。

我正在使用 Pygame,但这没关系。

我怎样才能做到这一点?

【问题讨论】:

    标签: python pygame 2d-games 2d-vector


    【解决方案1】:

    我建议计算跟随者和精灵之间的距离以及从(follower_xfollower_y)到(mainsprite_xmainsprite_y)的单位方向向量。
    距离可以通过计算Euclidean distance 得到。 Pygame 为此提供了distance_to()。单位方向向量可以通过将方向向量除以距离或通过归一化(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 并移动到精灵的follower int 方向:

    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
    

    最小示例: repl.it/@Rabbid76/PyGame-FollowMouseSmoothly

    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()
    

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      相关资源
      最近更新 更多