不要尝试在应用程序循环中使用循环来控制对象。使用应用程序循环。
您必须在应用程序循环中处理事件。分别见pygame.event.get()pygame.event.pump():
对于游戏的每一帧,您都需要对事件队列进行某种调用。这确保您的程序可以在内部与操作系统的其余部分进行交互。
使用pygame.time.Clock 控制每秒帧数,从而控制游戏速度。
pygame.time.Clock 对象的方法tick() 以这种方式延迟游戏,即循环的每次迭代消耗相同的时间段。见pygame.time.Clock.tick():
这个方法应该每帧调用一次。
pygame.time.Clock.tick 返回自上次调用以来的毫秒数。当您在应用程序循环中调用它时,这是自上一帧以来经过的毫秒数。将对象速度乘以每帧经过的时间,以获得恒定的运动,而不受 FPS 的影响。
以像素为单位定义玩家每秒应移动的距离 (move_per_second)。然后在应用循环中计算每帧的距离。
pygame.Rect.move 不会改变Rect 对象本身,但它会返回一个新的Rect 对象。这意味着,
rect.move(dx, 0)
不会改变任何东西。您必须将.move 返回的矩形分配给“自身”:
rect = rect.move(dx, 0)
您也可以使用pygame.Rect.move_ip
rect.move_ip(dx, 0)
小例子:
import pygame
pygame.init()
screen = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
rect = pygame.Rect(0, 250, 20, 20)
bot_vel = 500 # 500 pixel / second
run = True
while run:
dt = clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
dx = bot_vel * dt / 1000
rect.move_ip(dx, 0)
if rect.x > screen.get_width():
rect.x = 0
screen.fill((0,0,0))
pygame.draw.rect(screen, (255,255,255), rect)
pygame.display.flip()
pygame.quit()
exit()