阿波羅的戰(zhàn)車
2021-11-02 19:34:41
我想在一段時(shí)間內(nèi)插入對(duì)象的位置,我正在使用 pygame。當(dāng)游戲想要將對(duì)象移動(dòng)到一個(gè)位置時(shí),它會(huì)調(diào)用interpolate_position它想要的位置以及插值需要多長(zhǎng)時(shí)間。update在基本游戲循環(huán)中調(diào)用。此代碼是 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)更新是這樣調(diào)用的: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我的代碼有時(shí)工作正常,但有時(shí)當(dāng)對(duì)象應(yīng)該靜止時(shí),它會(huì)在某個(gè)方向上來(lái)回移動(dòng)一個(gè)像素。我的主要猜測(cè)是某種舍入誤差。我能做些什么來(lái)解決這個(gè)問(wèn)題?提前致謝。
1 回答

明月笑刀無(wú)情
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果您想限制val在 [0, 1] 范圍內(nèi),那么我更愿意使用min()and max():
val = max(0, min(val, 1))
self.start_lerp不斷增加,直到它“到達(dá)” self.total_lerp_time。
所以條件self.start_lerp - self.total_lerp_time <= 2 * dt是錯(cuò)誤的。
它一定要是:
if self.total_lerp_time - self.start_lerp > 2 * dt:
# [...]
或者甚至更好地使用內(nèi)置函數(shù)abs(),它甚至適用于負(fù)值:
if abs(self.total_lerp_time - self.start_lerp) > 2 * dt:
# [...]
添加回答
舉報(bào)
0/150
提交
取消