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

问题描述 投票: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
限制帧数,并在应用程序循环之前加载一次帧以提高性能。

在下面的例子中,

 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()


另请参阅发生碰撞时如何显示爆炸图像?

© www.soinside.com 2019 - 2024. All rights reserved.