2013-07-30 2 views
7

Я читал подобные вопросы по этому поводу в Stack Overflow, но они не помогли. Вот мой код:pygame.key.get_pressed() не работает

import pygame 
from pygame.locals import * 

pygame.init() 
screen = pygame.display.set_mode((640, 480)) 
pygame.display.set_caption('Hello World') 
pygame.mouse.set_visible(1) 

done = False 
clock = pygame.time.Clock() 

while not done: 
    clock.tick(60) 

    keyState = pygame.key.get_pressed() 

    if keyState[pygame.K_ESCAPE]: 
     print('\nGame Shuting Down!') 
     done = True 

escape Нажатие не выйти из игры или распечатать сообщение. Это ошибка? Если я напечатаю значение для keyState [pygame.K_ESCAPE], оно всегда равно нулю.

ответ

12

Проблема в том, что вы не обрабатываете очередь событий pygame. Вы должны просто вызов pygame.event.pump() в конце вашего цикла, а затем ваш код работает отлично:

... 
while not done: 
    clock.tick(60) 

    keyState = pygame.key.get_pressed() 

    if keyState[pygame.K_ESCAPE]: 
     print('\nGame Shuting Down!') 
     done = True 
    pygame.event.pump() # process event queue 

Из docs (курсив):

pygame.event.pump()

внутри процесса Pygame обработчики событий

pump() -> None

Для каждого кадра вашей игры вам необходимо сделать какой-то вызов в очередь событий. Это гарантирует, что ваша программа может внутренне взаимодействовать с остальной частью операционной системы. Если вы не используете другие функции событий в своей игре, вы должны вызвать pygame.event.pump(), чтобы позволить pygame обрабатывать внутренние действия.

Эта функция не требуется, если ваша программа последовательно обрабатывает события в очереди через другие функции pygame.event.

Есть важные вещи, которые необходимо решать внутренне в очереди событий. Возможно, необходимо перекрасить главное окно или отреагировать на систему. Если вы не можете позвонить в очередь событий слишком долго, система может решить, что ваша программа заблокирована.

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

+0

На самом деле вам может потребоваться только вызов 'pygame.event.poll()', который может быть немного быстрее. – martineau

1

Может я предлагаю вместо этого использовать очередь событий? Это, вероятно, лучше:

while True: #game loop 
    for event in pygame.event.get(): #loop through all the current events, such as key presses. 
     if event.type == QUIT: 
      die() 

     elif event.type == KEYDOWN: 
      if event.key == K_ESCAPE: #it's better to have these as multiple statments in case you want to track more than one type of key press in the future. 
       pauseGame() 
+0

Я использовал этот метод раньше, но он не обрабатывает одновременные нажатия клавиш очень хорошо. – ZeroDivide

+0

Вы можете установить значения Boolean в переменные и сделать их True, когда есть 'keydown', и они снова делают их ложными, когда есть' keyup'. Затем вы просто проверяете, какая из переменных истинна. Я отредактирую свой ответ на примере во втором –

+1

@ZeroDivide, который вы можете смешивать и сопоставлять, используя события и get_state в зависимости от того, какие ключи должны использовать. – ninMonkey

0

сделать что-то вроде этого:

import pygame 
from pygame.locals import * 

pygame.init() 
screen = pygame.display.set_mode((640, 480)) 
pygame.display.set_caption('Hello World') 
pygame.mouse.set_visible(1) 

done = False 
clock = pygame.time.Clock() 

while not done: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 

    key = pygame.key.get_pressed() 

    if key[K_ESCAPE]: 
     print('\nGame Shuting Down!') 

    pygame.display.flip() 

вы не нужны pygame. на если даного и вы должны вызвать pygame.display.flip() так правильно показывает окно, то вам нужен цикл события для выхода из программы

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