Я использую Pygame time.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 и использую Pygame v1.9.3 на macOS. Буду очень признателен за любую помощь!