Sprite在一定距离范围内遵循另一种灵活的方式

问题描述 投票:1回答:1

我正在尝试使子画面遵循另一种灵活的子画面方式。

如果主精灵移动得更快,则追随者将落后更多,而如果追随者则是更慢的追随者。

运动本身可以使用以下(伪)代码:

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个回答
0
投票

我建议计算从动件与子图形之间的距离以及从(follower_xfollower_y)到(mainsprite_xmainsprite_y)的单位方向向量。该距离可以通过计算Euclidean distance来获得。 Pygame为此提供了distance_to()。可以通过将方向矢量除以距离或将方向矢量归一化(distance_to())来计算单位方向矢量:

normalize()

现在您可以定义一个精确的normalize()并移动到精灵的跟随者int方向:

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_distanceif 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
© www.soinside.com 2019 - 2024. All rights reserved.