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

avatar
S_Zizzle
24 сентября 2019 в 18:18
428
1
3

Я делаю клон 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)

avatar
Rabbid76
24 сентября 2019 в 19:32
4

[...] и иметь два для события в 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)