【问题标题】:Gravity strength and jump height somehow dependant on framerate - Pygame重力强度和跳跃高度以某种方式依赖于帧群 - pygame
【发布时间】:2020-05-28 14:57:50
【问题描述】:

我目前正处于使用 pygame 为学校项目制作经典 2D 平台游戏的早期阶段,当时我正在尝试跳跃机制,但遇到了这个相当奇怪的问题。尽管我已经考虑了更新之间的时间增量,但当帧之间的时间增加时,跳跃长度和高度都会变短

Here 我让 Player 对象的 3 个实例在屏幕上跳跃,以 700 像素/秒的恒定速度向右移动,并以 700 像素/秒的初始速度向上移动。它们每个人为增加的最小 delta_time 分别为 0.001s、0.017s 和 0.1s。

这是在 Player 对象的更新函数中计算新速度和位置向量的方式,该函数每帧调用一次(delta_time 从主更新循环传入):

self.speed.y += 1000.0 * delta_time
self.position += self.speed * delta_time

这就是在主更新循环的每个周期结束时计算 delta_time 的方式(第一帧初始化为零):

delta_time = time.time() - pre_time
pre_time = time.time()
if delta_time < min_delta_time:
    time.sleep(min_delta_time - delta_time)
    delta_time += time.time() - pre_time
    pre_time = time.time()

min_delta_time 表示帧更新之间的最短时间。

经过多次尝试修复此问题,我很确定问题在于更新速度的行,但即使在仔细检查数学之后,我仍然无法弄清楚问题所在。起初我以为可能是 delta_time 不精确,但如果是这样的话,水平速度也会受到影响,并且轨迹仍然会排成一行。

那么我可以更改任何东西以使跳跃/重力更加一致吗?

【问题讨论】:

  • time.time() 正在返回浮点数秒数,这可能会在高帧速率下失去准确性。更好的方法是使用pygame.time.get_ticks(),它返回自程序启动以来的整数毫秒数。

标签: python pygame game-physics


【解决方案1】:

这与其说是编码错误,不如说是模型中的逻辑错误:通过将加速度建模为在更新点瞬时发生而不是在整个时间跨度内连续发生,引入的不准确性会变得越来越稀疏更新。

为了说明这一点,假设一个物体从停止处以 1m/s^2 的速度加速。如果我们以 1 秒的间隔对它进行建模,则在 6 秒后,我们的模型会将对象放置在 21m 处。以 2 秒的间隔重复,我们将其置于 24m,而 3 秒的间隔将其置于 27m。但是实际位置应该是18m。

解决方案是考虑模拟时间跨度上的平均速度,而不是采样点处的瞬时速度。换句话说,不是计算整个跨度的加速度值,而是将结果用作整个跨度的速度,加上跨度加速度的一半,使用 that 速度来计算在该跨度中行进的距离,然后加上剩下的一半加速度。

所以你的更新逻辑会变成这样:

self.speed.y += 500.0 * delta_time
self.position += self.speed * delta_time
self.speed.y += 500.0 * delta_time

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多