我正在尝试使子画面遵循另一种灵活的子画面方式。
如果主精灵移动得更快,则追随者将落后更多,而如果追随者则是更慢的追随者。
运动本身可以使用以下(伪)代码:
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,但这没关系。
我该如何实现?
我建议计算从动件与子图形之间的距离以及从(follower_x
,follower_y
)到(mainsprite_x
,mainsprite_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_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