Python 如何修复位置插值引起的抖动

Python 如何修复位置插值引起的抖动,python,pygame,linear-interpolation,Python,Pygame,Linear Interpolation,我想在一段时间内插值对象的位置,我使用的是pygame 当游戏想要将对象移动到一个位置时,它会调用interpolate\u position,其中包含它想要的位置以及插值所需的时间更新在基本游戏循环中调用。 此代码是GameObject类的一部分: def update(self, dt): if self.is_lerping: self.update_interpolate(dt) def update_interpolate(se

我想在一段时间内插值对象的位置,我使用的是pygame

当游戏想要将对象移动到一个位置时,它会调用
interpolate\u position
,其中包含它想要的位置以及插值所需的时间<代码>更新在基本游戏循环中调用。 此代码是GameObject类的一部分:

    def update(self, dt):
        if self.is_lerping:
            self.update_interpolate(dt)

    def update_interpolate(self, dt):
        if self.start_lerp - self.total_lerp_time <= 2 * dt:
            val = dt / (self.total_lerp_time - self.start_lerp)
            val = val if 0 < val < 1 else 1
            self.position = self.position.lerp(self.lerp_goal, val)
            self.start_lerp += dt
        else:
            self.position = self.lerp_goal
            self.is_lerping = False

    def interpolate_position(self, pos, lerp_time):
        self.is_lerping = True
        self.total_lerp_time = lerp_time
        self.start_lerp = 0
        self.lerp_goal = Vector2(pos)

我的代码有时工作得很好,但有时当对象应该静止时,它会在某个方向上来回移动一个像素。我的主要猜测是某种舍入误差。我能做些什么来解决这个问题?提前感谢。

如果您想将
val
夹紧到[0,1]范围,那么我更愿意使用和:

val=max(0,min(val,1))

self.start\u lerp
不断递增,直到它“达到”
self.total\u lerp\u时间

因此,条件
self.start\u lerp-self.total\u lerp\u time 2*dt:
# [...]
或者更好地使用内置函数,它甚至可以用于负值:

如果abs(self.total\u lerp\u time-self.start\u lerp)>2*dt:
# [...]

发生错误是因为目标和当前位置相同。我添加了一个检查以防止出现这种情况,现在一切正常。

我添加了一个检查,以查看要插入的位置是否与当前位置相同,如果是,则不要插入
if pos==self.position:return
。这可能是修复方法,但我不能100%确定,因为这个bug是难以捉摸的。你是说
0
不同于
0
?我运行这段代码是为了测试:
v=-2,而v<2:v+=0.01,如果-1
,但不打印任何内容。@Koby27是的,在这种情况下,您是对的,在Python中是完全有效的。
AVERAGE_DELTA_MILLIS = round(float(1000) / 60, 4)
while True:
    before_update_and_render = self.clock.get_time()
    delta_millis = (update_duration_millis + sleep_duration_millis) / 1000            
    o.update(delta_millis)  #  Updates the object
    update_duration_millis = (self.clock.get_time() - before_update_and_render) * 1000
    sleep_duration_millis = max([2, AVERAGE_DELTA_MILLIS - update_duration_millis])
    time.sleep(sleep_duration_millis / 1000)  # Sleeps an amount of time so the game will be 60 fps