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
这里,
- self.vel固定
- z 对于每种粒子类型都是固定的
- 每种粒子类型的重力都是固定的
因此,'dy' 在任何给定时间段内都将保持不变。然而,模拟显示抛射运动...如何?
重力不是加到self.y
,而是加到self.dy
。这发生在每一帧中。因此,self.dy
的数量在每一帧中增加一点,并且对象的位置在每一帧中变化更多一点。这会导致运动加速和下落速度加快。
我被困在一个特定的项目上 - 第 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
这里,
- self.vel固定
- z 对于每种粒子类型都是固定的
- 每种粒子类型的重力都是固定的
因此,'dy' 在任何给定时间段内都将保持不变。然而,模拟显示抛射运动...如何?
重力不是加到self.y
,而是加到self.dy
。这发生在每一帧中。因此,self.dy
的数量在每一帧中增加一点,并且对象的位置在每一帧中变化更多一点。这会导致运动加速和下落速度加快。