我有一个动画,每次单击鼠标按钮时都需要播放。
我将帧存储在列表中,对于 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
限制帧数,并在应用程序循环之前加载一次帧以提高性能。
在下面的例子中,
clock.tick(100)
设置每秒的帧数,而animate_frames = 10
定义将显示多少帧动画:
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
try:
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'))
except:
explosion = []
for i in range(10):
e = pygame.Surface((100, 100), pygame.SRCALPHA)
pygame.draw.circle(e, (200 - i * 10, 200 - i * 20, 0), (50, 50), i*5)
explosion.append(e)
clock = pygame.time.Clock()
animate_frames = 10
animations = []
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
animations.append([event.pos, 0])
screen.fill('#000000')
for animation in animations[:]:
animation[1] += 1
frame_index = animation[1] // animate_frames
if frame_index < len(explosion):
frame = explosion[frame_index]
framerect = frame.get_rect(center=animation[0])
screen.blit(frame, framerect)
else:
animations.remove(animation)
pygame.display.update()
clock.tick(100)
pygame.quit()
另请参阅发生碰撞时如何显示爆炸图像?