Вопрос-Ответ

Faster version of 'pygame.event.get()'. Why are events being missed and why are the events delayed?

Более быстрая версия 'pygame.event.get ()'. Почему пропускаются события и почему они задерживаются?

Я создаю клон Asteroidz в pygame и у меня есть два for event in pygame.event.get() цикла, один для проверки запроса на выход и того, должна ли игра начинаться нажатием пробела, затем далее в игре, чтобы попытаться ограничить игрока от удерживания пробела нажатой и непрерывной стрельбы. Соответствующий код для моей check_input функции, которая запускается один раз в каждом цикле, приведен ниже;

def check_input(self):
for event in pygame.event.get(): #NOT CHECKING THIS FAST ENOUGH, WHOLE PROCESS IS TOO SLOW
if (event.type == pygame.KEYUP) and (event.key == pygame.K_SPACE):
print ('boop')
self.shootThrottle = 0

if self.shootThrottle == 0:
self.shootThrottle += 1
bullets.add(Bullet(self.shape[0][0],self.shape[0][1], self.angle))

key = pygame.key.get_pressed()

if key[pygame.K_LEFT]:
self.angle -= 7
self.rotate(-7)
elif key[pygame.K_RIGHT]:
self.angle += 7
self.rotate(7)

if self.angle > 360:
self.angle -= 360
elif self.angle < 0:
self.angle += 360

if key[pygame.K_UP]:
self.accelerate()
elif key[pygame.K_DOWN]:
self.decelerate()

Я использую shootThrottle как средство, чтобы попытаться остановить выпуск пуль, пока не будет отпущен пробел. Эта система работает, но из-за того, что for event in pygame.event.get() слишком медленная, она не функционирует должным образом.

Мы очень ценим любую помощь!

Переведено автоматически
Ответ 1

[...] и есть два цикла for event в pygame.event.get() циклах [..] "


В этом проблема. pygame.event.get() получите все сообщения и удалите их из очереди. Смотрите документацию:


Это позволит получить все сообщения и удалить их из очереди. [...]


Если pygame.event.get() вызывается в нескольких циклах событий, события получает только один цикл, но никогда не все циклы получают все события. В результате некоторые события оказываются пропущенными.

Получайте события один раз за кадр и используйте их в нескольких циклах или передавайте список или события функциям и методам, где они обрабатываются:

def handle_events(events):
for event in events:
# [...]

while run:

event_list = pygame.event.get()

# [...]

# 1st event loop
for event in event_list:
# [...]

# [...]

# 2nd event loop
for event in event_list:
# [...]

# [...]

# function which handles events
handle_events(event_list)
python python-3.x pygame