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)
# [...]
另见
我试图理解增量时间并写了这个简单的例子:
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)
# [...]
另见