我正在使用 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()
or pygame.time.delay()
代替Clock.tick()
.
我注意到的另一件有趣的事情是,如果你颠倒我的示例中最后两行代码的顺序(pygame.display.update()
and clock.tick(0.5)
),您可能期望屏幕会发生变化two按下一个键(而不是按下一个键)后的时钟周期。但是,如果我这样做,我会得到与按其他顺序时完全相同的效果。
我不确定这是一个错误还是我刚刚错过了这里发生的一些微妙的事情。我正在 macOS 上运行 Python 3.6.2 并使用 Pygame v1.9.3。您能提供的任何帮助将不胜感激!