Pygame 键被按下
Pygame key getting pressed
只要按下一个键,对 pygame 和 运行 的惯用表达方式是什么?使用 pygame.key.get_pressed()[pygame.K_p]==True
或 pygame.mouse.get_pressed()==(1,0,0)
它似乎只在按键或按钮被击中时做出反应。例如,是否应该使用 while
循环?
我 运行 下面的代码,只有在按下 key/button:
时,我才会在 shell 中打印
def main():
done = True
while done:
for i in pygame.event.get():
if pygame.key.get_pressed()[pygame.K_a] == 1:
print "Key a is being pressed..."
elif i.type == KEYDOWN and i.key == pygame.K_q:
done = 0
pygame.display.update()
pygame.quit()
main()
事件 KEYDOWN
意味着 "key changed state from UP to DOWN" - 它并不意味着 "key is held pressed all time"
当你开始按下键时 - 它生成事件 KEYDOWN
和 pygame.event.get()
returns 不是空列表 - for
循环可以执行 if pygame.event.get()
当您按住键时 - 它不会生成事件 KEYDOWN
- pygame.event.get()
returns 空列表 - for
循环不会执行 if pygame.event.get()
您的代码应该如下所示
running = True
while running:
# check events
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == pygame.K_q:
running = False
# do it outside of `for event` loop
# it is executed many times
if pygame.key.get_pressed()[pygame.K_a]:
print "Key is hold pressed..."
pygame.display.update()
或者 - 当你只需要执行一次时
key_A_pressed = False
running = True
while running:
# check events
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == pygame.K_q:
running = False
elif event.key == pygame.K_a:
key_A_pressed = True
# it is executed only once
print "Key A - start pressing"
if event.type == KEYUP:
if event.key == pygame.K_a:
key_A_pressed = False
# it is executed only once
print "Key A - stop pressing"
# do it only once - outside of `for event` loop
# it is executed many times
#if pygame.key.get_pressed()[pygame.K_a]:
# or
if key_A_pressed:
print "Key A is held pressed..."
pygame.display.update()
你应该使用:
def main():
done = False
while not done:
for i in pygame.event.get():
if i.type == KEYDOWN and i.key == pygame.K_q:
done = True
pressed = pygame.key.get_pressed()
if pressed[pygame.K_a]:
print "Key a is being pressed..."
pygame.display.update()
pygame.quit()
if __name__ == '__main__':
main()
您的代码中的问题是您仅在遍历所有接收到的事件时才检查是否按下了按键;所以如果没有事件,print "Key a is being pressed..."
部分永远不会执行。
把它放在事件循环之外。
此外,您不需要明确地与 True
进行比较; idiomatic/pythonic 方法就是使用 if pressed[pygame.K_a]:
.
只要按下一个键,对 pygame 和 运行 的惯用表达方式是什么?使用 pygame.key.get_pressed()[pygame.K_p]==True
或 pygame.mouse.get_pressed()==(1,0,0)
它似乎只在按键或按钮被击中时做出反应。例如,是否应该使用 while
循环?
我 运行 下面的代码,只有在按下 key/button:
时,我才会在 shell 中打印def main():
done = True
while done:
for i in pygame.event.get():
if pygame.key.get_pressed()[pygame.K_a] == 1:
print "Key a is being pressed..."
elif i.type == KEYDOWN and i.key == pygame.K_q:
done = 0
pygame.display.update()
pygame.quit()
main()
事件 KEYDOWN
意味着 "key changed state from UP to DOWN" - 它并不意味着 "key is held pressed all time"
当你开始按下键时 - 它生成事件 KEYDOWN
和 pygame.event.get()
returns 不是空列表 - for
循环可以执行 if pygame.event.get()
当您按住键时 - 它不会生成事件 KEYDOWN
- pygame.event.get()
returns 空列表 - for
循环不会执行 if pygame.event.get()
您的代码应该如下所示
running = True
while running:
# check events
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == pygame.K_q:
running = False
# do it outside of `for event` loop
# it is executed many times
if pygame.key.get_pressed()[pygame.K_a]:
print "Key is hold pressed..."
pygame.display.update()
或者 - 当你只需要执行一次时
key_A_pressed = False
running = True
while running:
# check events
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == pygame.K_q:
running = False
elif event.key == pygame.K_a:
key_A_pressed = True
# it is executed only once
print "Key A - start pressing"
if event.type == KEYUP:
if event.key == pygame.K_a:
key_A_pressed = False
# it is executed only once
print "Key A - stop pressing"
# do it only once - outside of `for event` loop
# it is executed many times
#if pygame.key.get_pressed()[pygame.K_a]:
# or
if key_A_pressed:
print "Key A is held pressed..."
pygame.display.update()
你应该使用:
def main():
done = False
while not done:
for i in pygame.event.get():
if i.type == KEYDOWN and i.key == pygame.K_q:
done = True
pressed = pygame.key.get_pressed()
if pressed[pygame.K_a]:
print "Key a is being pressed..."
pygame.display.update()
pygame.quit()
if __name__ == '__main__':
main()
您的代码中的问题是您仅在遍历所有接收到的事件时才检查是否按下了按键;所以如果没有事件,print "Key a is being pressed..."
部分永远不会执行。
把它放在事件循环之外。
此外,您不需要明确地与 True
进行比较; idiomatic/pythonic 方法就是使用 if pressed[pygame.K_a]:
.