这是一些更复杂的代码的一小部分,但基本上。我已经把问题缩小到这一段代码了。
我使用公式s = ut + 1/2 at^2来获得在一个实例中移动到时间的距离,在这种情况下,0.001秒,然后将进一步用于绘制窗口上的矩形。
import pygame
run = True
clock = pygame.time.Clock()
ex_s = pygame.Rect((500, 625, 50, 50))
start_height = ex_s.top
print(start_height, "m")
g = -9.8
v = 400
t = 0.001
while run:
ex_s.top -= (v * t) + ((g / 2) * (t ** 2))
print(ex_s.top - start_height)
if (ex_s.top - start_height) * -1 <= -10:
run = False
clock.tick(30)
我想让矩形根据它们的速度向上/向下移动。
当顶部达到y = 0时,矩形向上移动并卡住。如果"t"增加到0.1或更高,但我需要它是0.001的精度。当v的值增加一个数量级时,这个问题也解决了,改变g不做任何事情。
我尝试使用move和move_ip, y坐标根本没有改变。
我也试过手动推动y = 0以上的对象,当他们击中它,但它不做任何事情。这个问题随着小数点变化的事实让我相信它可能与pygame的整数坐标系统有关,但我不明白这将如何导致物体先移动,然后只在0处卡住。
Pygame不允许我使用float的rect.move,但我需要它。问题是pygame.Rect
对象只能存储整数数据。所以当你给矩形的坐标加一个小于1.0的值时,位置保持不变。您需要将矩形的位置存储在单独的变量中,并使用这些变量更新矩形的位置。
ex_s = pygame.Rect((500, 625, 50, 50))
ex_s_y = ex_s.top
# [...]
while run:
# [...]
# change position
ex_s_y = .....
ex_s.top = round(ex_s_y)
您没有更改时间t
变量,您的运动公式是错误的。你的初始时间,初始速度和g
都是错误的。
如果你想用精确的解来表示这个位置,就像这样做。
dt = 0.05
t = 0
g = 9.8 # It's positive by definition.
v = -100 # It's upward.
while run:
y = 625 + v*t + 0.5*g*t**2 # The acceleration is +g, downward.
t += dt
ex_s.top = y
...
如果你想近似地、迭代地求解运动方程,在循环中这样做。
...
y = 625
while run:
v += g * dt
y += v * dt
t += dt
ex_s.top = y
...
上述方法称为辛欧拉法。还有其他更精确的方法,如龙格-库塔法。