2017-02-10 4 views
1

У меня есть программа, которая рисует зеленый круг, который сжимается, и когда вы нажимаете p, круг исчезает и появляется красная линия. Но когда я нажимаю p, снова появляется зеленый круг, которого нет.Python pygame.event.get_pressed() не обновляется

Когда я вызываю функцию pygame.event.get_pressed() после того, как я нажимаю p, он всегда возвращает то же значение. Есть ли какой-то сброс клавиатуры, который я должен использовать, чтобы снова получить метод get_pressed()?

Вот мой код:

import pygame 
import time 

BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 

pygame.init() 

size = (700,700) 
screen = pygame.display.set_mode(size) 
screennumber = 1 

pygame.display.set_caption("Game Test") 

running = True 
width = 350 

clock = pygame.time.Clock() 

while running: 

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     running = False 

screen.fill(BLACK) 

pressed = pygame.key.get_pressed() 
print(pressed) 

if pressed[pygame.K_p]: 
    screennumber = 2 
else: 
    screennumber = 1 

if screennumber == 1: 

    pygame.draw.circle(screen,GREEN,[350,350], width,1) 

    pygame.display.flip() 

    if width>1: 
     width = width-1 

if screennumber == 2: 

     time.sleep(0.25) 
     pause = True 
     while pause: 
      pressed = pygame.key.get_pressed() 
      print(pressed) 
      if pressed[pygame.K_r]: 
       pause = False 

      pygame.draw.line(screen,RED,[0,0],[700,700],5) 

      pygame.display.flip() 

      clock.tick(21) 


pygame.display.flip() 

clock.tick(21) 


pygame.quit() 

Спасибо!

+0

Если остальная часть вашего кода (за исключением выхода) должна быть отступом после блока, вызывающего 'pygame.event.get()'? Я предполагаю, что 'pygame.key.get_pressed()' не обновляется до тех пор, пока не будет прочитано новое событие. –

ответ

1

Использование pygame.key.get_pressed не является надежным методом обработки ключей в реальном времени. Функция возвращает словарь с состоянием клавиатуры во время вызова функции. Но, если клавиша была нажата и выпущена между вызовами, словарь будет таким же, как если бы ключ вообще не был нажат. Лучший способ проверить, нажал ли пользователь ключ, обрабатывать события pygame.KEYDOWN в вашем цикле событий. Затем проверьте, подходит ли нужный вам номер KEYDOWN.

Вот версия вашей программы, которая состоит из трех разделов: 1) процесс событий, 2) обновление элементов игры, 3) рисование на экране.

import pygame 
import time 

BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 

pygame.init() 

size = (700,700) 
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Game Test") 

running = True 
width = 350 
paused = False 

clock = pygame.time.Clock() 

while running: 

    # process all events 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

     # -- HERE IS THE RELEVANT SECTION -- 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_p: 
       paused = not(paused) 

    # update everything 
    if not paused: 
     if width > 1: 
      width = width-1 

    # draw everything 
    screen.fill(BLACK) 
    if not paused: 
     pygame.draw.circle(screen,GREEN,[350,350], width,1) 
    else: 
     pygame.draw.line(screen,RED,[0,0],[700,700],5) 
    pygame.display.flip() 

    # update the clock 
    clock.tick(21) 


pygame.quit() 

Дайте мне знать, если возникнут какие-либо вопросы по поводу этого кода.

0

pygame.key.get_pressed() Обновляется при вызове одной из функций события. Поместите pygame.event.pump() в ваш цикл while pause:, и он работает так, как должен. pygame.event.pump() сообщает pygame, что вы не хотите использовать события, но должны обрабатывать внутренние действия.

В настоящее время ваша программа не будет реагировать на какие-либо события, когда присутствует красная линия (вы даже не можете закрыть окно), поэтому я бы предложил иметь цикл событий в вашем блоке while pause:, проверяя события pygame.QUIT.

Кроме того, если вы не назовете одну из функций события регулярно, ОС будет думать, что ваша программа разбилась.

+0

'pygame.event.get_pressed' получает состояние клавиатуры во время вызова функции. Не полезно проверять, нажал ли пользователь клавишу в последнем кадре, потому что состояние клавиши, которая была нажата и выпущена после последнего вызова, по-прежнему будет 'False'. Вместо этого OP должен обрабатывать все необходимые события в цикле событий. –

+0

Да, часто лучше использовать цикл событий, как описано в [link] (http://stackoverflow.com/documentation/pygame/5110/event-handling#t=201702100452096335115). –

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