【问题标题】:Coding Gravity in Pygame (Impractical Python Projects)Pygame 中的重力编码(不切实际的 Python 项目)
【发布时间】:2021-05-01 04:56:07
【问题描述】:

我被一个特定的项目困住了——Lee Vaughan 的《不切实际的 Python 项目》一书的第 13 章(模拟外星火山)。

在其中,我们应该模拟木星卫星 Io 上的火山。代码可以找到here

我的具体查询:

我了解粒子的位移首先通过以下方式计算:

radians = math.radians(orient)
self.dx = self.vel * math.cos(radians)
self.dy = -self.vel * math.sin(radians) # negative as y increases down

然后重力被添加到Y轴:

self.dy += Particle.GRAVITY
pg.draw.line(self.background, self.color, (self.x, self.y), (self.x + self.dx, self.y + self.dy))
self.x += self.dx
self.y += self.dy

我的问题是:在上述所有情况下,在某一时刻,重力必须足够大,以至于粒子开始下降而不是上升;然而,self.dy 只是两个常数(初始速度、重力)的函数。所以它应该继续走直线。例如,对于以某个角度(例如,z)喷射的粒子:

self.dy = self.vel*math.sin(z) + particle.GRAVITY

这里,

  1. self.vel 已修复
  2. z 对于每种粒子类型都是固定的
  3. 每种粒子类型的重力都是固定的

因此,“dy”在任何给定时间段内都将保持不变。然而,模拟显示了弹丸运动......如何?

【问题讨论】:

  • 重力在每个时间步被添加到dy。所以,引力越来越大。加速度是二阶导数,因此会修改每一步的速度,然后修改位置。
  • 谢谢,知道了。我被第 50 行弄糊涂了。我原以为更新函数在后续更新中是 dy + Gravity,但我现在看到它只是 dy += Gravity(在第一个周期后基本上覆盖了第 50 行。非常感谢。跨度>

标签: python pygame gravity


【解决方案1】:

重力不是添加到self.y,而是添加到self.dy。这发生在每一帧。因此,self.dy 的数量在每一帧中都会增加一点,而对象的位置在每一帧中都会发生更多的变化。这会导致运动加速和下降速度加快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多