当前位置: 首页 > 知识库问答 >
问题:

重力强度和跳跃高度在某种程度上依赖于Framerate-Pygame

高豪
2023-03-14

我目前正在为一个学校项目使用pygame制作一个经典的2D平台的早期阶段,我正在实验跳跃机械师,这时我遇到了这个相当奇怪的问题。即使我考虑了更新之间的时间增量,但是当帧之间的时间增加时,跳变长度和跳变高度都会变短。

这里我让3个Player对象跳过屏幕,以700像素/秒的恒定速度向右移动,初始速度为700像素/秒。人工增加的最小延迟时间分别为0.001s、0.017s和0.1s。

这就是在Playerhtml" target="_blank">对象的update函数中计算新速度和位置向量的方式,该函数每帧调用一次(delta_time从主update循环传入):

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不精确,但如果是这样的话,水平速度也会受到影响,而且轨迹仍然会排列。

所以我能改变什么让跳跃/重力更一致吗?

共有1个答案

仲孙翔飞
2023-03-14

这不是编码中的一个错误,而是模型中的一个逻辑错误:通过将加速建模为在更新点瞬时发生,而不是在整个时间范围内连续发生,引入了不精确性,更新越稀疏越大。

为了说明这一点,考虑一个物体从停止开始以1m/s^2的速度加速。如果我们以1秒的间隔对此进行建模,6秒后,我们的模型将把物体放在21米处。以2秒的间隔重复,我们将把它放在24米处,3秒的间隔将把它放在27米处。但是,真正的位置应该是18米。

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

因此您的更新逻辑将变成如下内容:

self.speed.y += 500.0 * delta_time
self.position += self.speed * delta_time
self.speed.y += 500.0 * delta_time
 类似资料:
  • 我正在尝试我的Matplotlib图表的一些功能,我想在图表的不同部分创建一系列小正方形。 以下是文档说明的内容:下面的示例演示了使用数组在一个命令中绘制具有不同格式样式的多条线。 我的问题是:我不需要一行正方形,我只需要在X,Y坐标的某个位置加上一行,但我遇到的问题是找到一种方法使它变小,下面是我尝试的: 我试图将设置为不同的值,但没有任何变化。文档在这方面有点模糊,有人能告诉我如何设置正方形的

  • 问题内容: 总菜鸟问题,但在这里。 CSS HTML 基本上,我试图模拟一个按钮,使一个跨度(或某个范围)看起来像一个输入字段旁边的按钮,由于自动填充生成器会在onEnter上产生错误,因此实际上不需要是一个输入字段。认为这是目前的快速解决方案,但显然不是。 谢谢。 问题答案: 跨度是一个内联元素。它没有宽度或高度。 您可以将其转换为块级元素,然后它将接受您的维度指令。

  • 主要内容:1. width,2. height,3. max-width 和 max-height,4. min-width 和 min-heightCSS 尺寸属性指的就是元素的宽度和高度属性,虽然说非常简单,但却是必须掌握的技能。CSS 中提供了 width、height、max-width、min-width、max-height 和 min-height 等几个属性来设置元素的宽度和高度,这些元素使用起来非常简单,下面我们就来简单介绍一下。 1. width 通过 width 属性可以设

  • 问题内容: 是否可以在锚标签上设置像素的宽度和高度?我希望锚标签具有背景图像,同时将文本保留在锚内。 问题答案: 您需要制作锚点或,然后它将接受宽度和高度值。

  • 有没有合理的方法让Gson以不同于顶层对象的方式处理嵌套对象?要序列化的东西是实体,它们都有一个< code>id。嵌套的实体应该用它的< code>id来代替(以缩短输出并可能避免无休止的递归)。 假设有一个 我执行 当序列化<code>bart</code>时,我得到的是 这比我需要的要多得多。我实际上从不想序列化嵌套实体,它们的 已经足够好了。 使用 <罢工> 全球的 线程局部变量hack和

  • 问题内容: html CSS 我想在我将display:inline属性添加到css中后,立即以其原始高度和宽度(在css中设置)并排显示两个div,它似乎失去了先前定义的高度和宽度。[用#1和#2检查divs似乎松动了高度和宽度设置] 有人可以指出我似乎正在做的错误或此怪异行为的解决方法吗? 问题答案: 内联对象没有高度或宽度。为什么要先将它们设置为内联?您可能想要浮动它们或使用它们。