为了账号安全,请及时绑定邮箱和手机立即绑定

重力强度和跳跃高度以某种方式依赖于帧率 - Pygame

重力强度和跳跃高度以某种方式依赖于帧率 - Pygame

跃然一笑 2022-07-26 20:46:06
我目前正处于使用 pygame 为学校项目制作经典 2D 平台游戏的早期阶段,当我遇到这个相当奇怪的问题时,我正在尝试跳跃机制。即使我考虑了更新之间的时间增量,当帧之间的时间增加时,跳跃长度和高度都会变短。在这里,我让 Player 对象的 3 个实例在屏幕上跳跃,以 700 像素/秒的恒定速度向右移动,初始向上速度为 700 像素/秒。它们每个人为增加的最小 delta_time 分别为 0.001s、0.017s 和 0.1s。这是在 Player 对象的更新函数中计算新速度和位置向量的方式,每帧调用一次(delta_time 从主更新循环传入):self.speed.y += 1000.0 * delta_timeself.position += self.speed * delta_time这就是在主更新循环的每个周期结束时计算 delta_time 的方式(第一帧初始化为零):delta_time = time.time() - pre_timepre_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 不精确,但如果是这种情况,水平速度也会受到影响,并且轨迹仍然会排列。那么我可以改变任何东西以使跳跃/重力更加一致吗?
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

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


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


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


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


self.speed.y += 500.0 * delta_time

self.position += self.speed * delta_time

self.speed.y += 500.0 * delta_time


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号