Python pygame.event.get_pressed()没有更新

时间:2017-02-10 04:21:22

标签: python pygame

我有一个绘制绿色圆圈缩小的程序,当你按 p 时,圆圈消失并出现一条红线。但是,当我再次按 p 时,绿色圆圈应该重新出现,而不是。

每次在第一次按 p 后调用pygame.event.get_pressed()函数时,它总是返回相同的值。我必须使用某种类型的键盘重置才能让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()

谢谢!

2 个答案:

答案 0 :(得分: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()

如果您对此代码有任何疑问,请与我们联系。

答案 1 :(得分:0)

当您调用其中一个事件函数时,

pygame.key.get_pressed()会更新。将pygame.event.pump()放在while pause:循环中,它可以正常工作。 pygame.event.pump()告诉pygame您不想使用这些事件,但它应该处理内部操作。

但目前您的程序在红线存在时无法响应任何事件(您甚至无法关闭窗口),因此我建议您在while pause:块中检查{ {1}}事件。

另外,如果您不定期调用其中一个事件函数,操作系统会认为您的程序已崩溃。