Pygame 中的重力编码(不切实际的 Python 项目)

Coding Gravity in Pygame (Impractical Python Projects)

我被困在一个特定的项目上 - 第 13 章(模拟外星火山)- Lee Vaughan 的不切实际 Python 项目书。

在其中,我们应该模拟木星卫星 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' 在任何给定时间段内都将保持不变。然而,模拟显示抛射运动...如何?

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