首页 > 解决方案 > Pygame:display.update() 直到时钟延迟后才会更新

问题描述

我正在使用 pygametime.Clock以较低的 FPS 运行我的游戏,我注意到我的输入似乎需要额外的一帧才能生效。我做了一些调试并意识到这不是问题,pygame.event.get()而是pygame.display.update(). 我编写了一个简单的程序来演示这个问题:(程序说明在代码片段下方)

import pygame, sys
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
colour = 1
key_press = False

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            screen.fill((0,255,0))
            key_press = True
            print("A key was pressed.")

    if not key_press:
        screen.fill((colour*255, colour*255, colour*255))
        colour = not colour
    else:
        key_press = False

    pygame.display.update()
    clock.tick(0.5)

程序每两秒在黑白之间闪烁屏幕,每当按下任何键时,屏幕都会变为绿色并"A key was pressed"打印到控制台。但是,当我运行它时,文本会在正确的时间打印,但屏幕直到下一帧才会变为绿色。这让我相信pygame.display.update()当我调用函数时不会更新屏幕。

问题似乎与调用后的延迟有关pygame.display.update()。如果您更改时钟的 FPS,问题仍然存在。如果您使用time.wait()pygame.time.delay()代替延迟,也会发生这种情况Clock.tick()

我注意到的另一件有趣的事情是,如果您颠倒我示例中最后两行代码的顺序 (pygame.display.update()clock.tick(0.5)),您可能会期望屏幕会在按下一个键而不是一个键后更改两个时钟周期。但是,如果我这样做,我会得到与其他顺序完全相同的效果。

我不确定这是否是一个错误,或者我只是错过了这里发生的一些微妙的事情。我正在运行 Python 3.6.2 并在 macOS 上使用 Pygame v1.9.3。您可以提供的任何帮助将不胜感激!

标签: python-3.xpygame

解决方案


我可以通过在 pygame.display.update() 调用和时钟之间调用 pygame.event.pump() (它不会清除事件队列,因此不会丢失事件处理)来修复一个程序中的这个故障。滴答(FPS)调用。基本上,我的主要游戏循环以:

pygame.display.update()
pygame.event.pump()
clock_object.tick(FPS_CONSTANT)

推荐阅读