以不同于游戏窗口的帧率渲染图像

问题描述 投票:0回答:1

我有一个动画,每次单击鼠标按钮时都需要播放。

我将帧存储在列表中,对于 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()
python pygame frame-rate
1个回答
0
投票

实际上,动画在 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()
© www.soinside.com 2019 - 2024. All rights reserved.