pygame 增量时间导致运动不一致

pygame delta time causes inconsistent movement

我试图理解增量时间并写了这个简单的例子:

import pygame, sys, time

pygame.init()
screen = pygame.display.set_mode((1280,720))
clock = pygame.time.Clock()

rect1 = pygame.Rect(0,150,100,100)
rect2 = pygame.Rect(1180,500,100,100)
speed = 300

last_time = time.time()

while True:
    dt = time.time() - last_time
    last_time = time.time()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill('white')
    rect1.x += speed * dt
    rect2.x -= speed * dt

    pygame.draw.rect(screen,'red',rect1)
    pygame.draw.rect(screen,'green',rect2)

    pygame.display.update()
    clock.tick(60)

我遇到的问题是左移比右移快。因此在代码片段中,绿色矩形 (rect2) 到达屏幕末端的速度明显快于红色矩形。

我还尝试使用 pygame.clock 来获取增量时间:

import pygame, sys, time

pygame.init()
screen = pygame.display.set_mode((1280,720))
clock = pygame.time.Clock()

rect1 = pygame.Rect(0,150,100,100)
rect2 = pygame.Rect(1180,500,100,100)
speed = 300

while True:

    dt = clock.tick(60) / 1000

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill('white')
    rect1.x += speed * dt
    rect2.x -= speed * dt

    pygame.draw.rect(screen,'red',rect1)
    pygame.draw.rect(screen,'green',rect2)

    pygame.display.update()

但是结果还是一样

我真的很困惑,我做错了吗?

编辑:有人关闭了它并链接到 deltatime 在更高帧速率下不工作。这里的帧率是恒定的60fps。

由于pygame.Rect应该表示屏幕上的一个区域,因此pygame.Rect对象只能存储整数数据。

The coordinates for Rect objects are all integers. [...]

当对象的新位置分配给 Rect 对象时,坐标的小数部分丢失。如果每帧都这样做,位置误差会随着时间累积。

如果要以浮点精度存储对象位置,则必须将对象的位置存储在单独的变量中,并且必须同步 pygame.Rect 对象。 round坐标并将其赋给矩形的位置:

rect1 = pygame.Rect(0,150,100,100)
rect2 = pygame.Rect(1180,500,100,100)
pos1_x = rect1.x
pos2_x = rect2.x  
while True:
    # [...]

    pos1_x += speed * dt
    pos2_x -= speed * dt
    rect1.x = round(pos1_x)
    rect2.x = round(pos2_x)
 
    # [...]

另见