我有一个绘制绿色圆圈缩小的程序,当你按 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()
谢谢!
答案 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}}事件。
另外,如果您不定期调用其中一个事件函数,操作系统会认为您的程序已崩溃。