2014-03-26 3 views
0

Я делаю игру, в которой вы перемещаете персонажа с помощью клавиш со стрелками на клавиатуре. Поскольку мой ноутбук иногда думает, что я нажал клавишу дважды, я хотел убедиться, что программа дождалась, пока я не отпущу нажатую клавишу. Я использую метод key.get_pressed(). Проблема в том, что когда я нажимаю клавишу, действие выполняется, но цикл, ожидающий отпускания ключей, продолжает работать, потому что событие get_pressed() считает, что я все еще нажал кнопку. Вот код:pygame get_pressed остается true

while ChangeRun == False: # main game loop 
    for Event in pygame.event.get(): 
     if Event == QUIT: 
      pygame.quit() 
      sys.exit() 

    BUTTON = -1 
    if pygame.key.get_pressed()[K_UP]: 
     BUTTON = 0 
    elif pygame.key.get_pressed()[K_DOWN]: 
     BUTTON = 1 
    elif pygame.key.get_pressed()[K_RIGHT]: 
     BUTTON = 2 
    elif pygame.key.get_pressed()[K_LEFT]: 
     BUTTON = 3 
    elif pygame.key.get_pressed()[K_p]: 
     BUTTON = 4 
    elif pygame.key.get_pressed()[K_RETURN]: 
     BUTTON = 5 


    if BUTTON == 4 or BUTTON == 5: 
     Execute() 
    elif BUTTON != -1: 
     SetDirection() 

    DisplaySurface() # Displays all data on screen 
    # it works until these rows: 
    while pygame.key.get_pressed()[K_UP] or pygame.key.get_pressed()[K_DOWN] or pygame.key.get_pressed()[K_LEFT] or pygame.key.get_pressed()[K_RIGHT] or pygame.key.get_pressed()[K_p] or pygame.key.get_pressed()[K_RETURN]: 
     pass # Keeps running because the get_pressed() method thinks one of the buttons is still pressed... 

Я проверил, что было неправильно, печатая все get_pressed() значения. Он показал, что нажатая кнопка продолжает возвращаться, даже когда я ее выпустил.

Надеюсь, это ясно и что кто-то может помочь.

+0

Итак, вы хотите, чтобы ваш персонаж двигался только один раз каждый раз, когда вы нажимаете и отпускаете ключ? – sshashank124

+0

Почему бы вам не получить ключ, нажатый в 'for Event in pygame.event.get', намного легче для меня, но я согласен с Dominic, вы каждый раз устанавливаете кнопку' -1', поэтому должны работать , – KodyVanRy

ответ

2

Надеюсь, вы прочли мой комментарий, но лично следующее: как я это сделаю, это потому, что вы проверяете событие, а затем проверяете, какое это событие было просто более полным доказательством.

Это, очевидно, внутри цикла while.

BUTTON = -1 

for event in pygame.event.get(): 
    if event.type == QUIT: 
     pygame.quit() 
     sys.exit() 
    elif event.type in [KEYDOWN, KEYUP]: 
     if event.key == K_UP: 
      BUTTON = 0 
     elif event.key == K_DOWN: 
      BUTTON = 1 
     #and so on 

, а затем в конце использования ...

while True: 
    for event in pygame.event.get(): 
     if event.type in [KEYDOWN, KEYUP]: 
      if event.key == K_DOWN or event.key == K_UP or event.key == K_LEFT or event.key == K_RIGHT or event.key == K_SPACE: 
       pass 
      else: 
       break 

Это происходит потому, что pygame.event.get() удалить все события из очереди и поэтому, если вы вызываете его не должно иметь ничего если, как сказал Доминик, ваша клавиатура сломана.

+0

У меня получилась ошибка при попытке: 'NameError: name 'KEY_PRESSED' не определен' –

+0

Я заменил событие KEY_PRESSED на' KEYDOWN' в первой части, а во второй части 'if event.type в [KEYDOWN, KEYUP ] '. Теперь это работает. –

+0

Да, мне жаль, что я должен был уделять больше внимания при ответе, теперь мой авар был отредактирован – KodyVanRy

Смежные вопросы