我有一个使用Pygame构建的简单射弹运动模拟。我将FPS限制为60并计算每帧的增量时间。然后我使用这个增量时间来更新我的射弹的位置。但问题是,更新似乎很慢。
根据我对给定射弹轨迹的纸张计算,射弹应在不到5秒的时间内完成其路径。然而,在射弹完成其路径之前已经过了更多的时间。这是我的代码:
def update(self, dt):
if not self.is_on_ground:
self.time += dt # time is initialized to 0
# calculate initial x and y velocities
vx = self.vi * math.cos(self.angle)
vy = self.vi * math.sin(self.angle)
# kinematics
self.dx = (vx * self.time)
self.dy = (vy * self.time) + ((-9.8 * (self.time ** 2)) / 2)
# update old positional values
self.x = self.dx + self.init_x
self.y = self.init_y - self.dy
# update rectangle position
self.rect.center = (self.x, self.y)
# check if the ball has hit the ground
self.check_collisions()
我希望球会在计算时间的同时击中地面,但是,它并没有。我已经排除了这是一个FPS问题的可能性,因为打印dt
总是给我一个0.017秒(大约1/60)。我错过了什么吗?
以下是一个示例运行:
t x y vi angle
0.5 687.51 751.21 21.93 1.15
t x y vi angle
1.0 692.02 744.88 21.93 1.15
t x y vi angle
1.51 696.63 740.95 21.93 1.15
t x y vi angle
2.02 701.14 739.59 21.93 1.15
t x y vi angle
2.53 705.78 740.77 21.93 1.15
t x y vi angle
3.04 710.38 744.5 21.93 1.15
t x y vi angle
3.55 715.0 750.83 21.93 1.15
t x y vi angle
4.07 719.62 759.75 21.93 1.15
注意 - 较低的y值表示"物理"更高
使用等式v_yf = v_yi + gt^2
并求解t
将得到大约2秒的时间。根据结果,该计划需要两倍的时间来实现这一目标。
编辑:添加了日志