我有一个动画,每次单击鼠标按钮时都需要播放。
我将帧存储在列表中,对于 Pygame 渲染的每一帧,列表中的一帧是
blit
到屏幕。
我的问题是因为每一帧都会发生这种情况,所以动画以 1000fps 播放,即使只有 8 帧,所以动画不明显。有没有办法以 16fps 的速度运行动画,同时仍然允许 Pygame 以正常速度运行游戏循环?我有一个游戏需要以 Pygame 的正常渲染速度运行,但动画应该播放得更慢。
这是我目前正在做的一个例子:
pygame.init()
screen = pygame.display.set_mode((800, 600))
running = True
while running:
screen.fill('#000000')
mouse_pos = pygame.mouse.get_pos()
explosion = (pygame.image.load('assets/Explosion/E_1.png'), pygame.image.load('assets/Explosion/E_2.png'),
pygame.image.load('assets/Explosion/E_3.png'), pygame.image.load('assets/Explosion/E_4.png'),
pygame.image.load('assets/Explosion/E_5.png'), pygame.image.load('assets/Explosion/E_6.png'),
pygame.image.load('assets/Explosion/E_7.png'), pygame.image.load('assets/Explosion/E_8.png'))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
for frame in explosion:
framerect = frame.get_rect(center=mouse_pos)
screen.blit(frame, framerect)
pygame.display.update()
pygame.quit()
实际上,动画在 1 帧内渲染,因为您在应用程序循环内的 for 循环中渲染动画。您需要使用应用程序循环。使用
pygame.time.Clock.tick
限制帧数并在应用程序循环之前加载一次帧以提高性能:
explosion = (pygame.image.load('assets/Explosion/E_1.png'), pygame.image.load('assets/Explosion/E_2.png'),
pygame.image.load('assets/Explosion/E_3.png'), pygame.image.load('assets/Explosion/E_4.png'),
pygame.image.load('assets/Explosion/E_5.png'), pygame.image.load('assets/Explosion/E_6.png'),
pygame.image.load('assets/Explosion/E_7.png'), pygame.image.load('assets/Explosion/E_8.png'))
clock = pygame.time.Clock()
animate = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
animation_pos = event.pos
animate_image = 0
animate = True
for frame in explosion:
framerect = frame.get_rect(center=mouse_pos)
screen.blit(frame, framerect)
screen.fill('#000000')
if animate:
frame = explosion[animate_image]
framerect = frame.get_rect(center=animation_pos)
screen.blit(frame, framerect)
animate_image += 1
if animate_image >= len(explosion):
animate = False
pygame.display.update()
clock.tick(20)
pygame.quit()