如何使用pygame.KEYDOWN?

时间:2014-08-25 21:35:00

标签: python events pygame keydown

所以,我的问题很可能已被问到,但我不知道要搜索什么,并且没有找到太多。所以,我的问题是,我做了2个函数,它们会检查一个事件

def get_pygame_events():
  pygame_events = pygame.event.get()
  return pygame_events

def get_keys_pressed(self):
  keys_pressed = get_pygame_events()  #pygame.event.get(pygame.KEYDOWN)
  # print(keys_pressed)
  keys_pressed_list = []
  for event in keys_pressed:
    if event.type == pygame.KEYDOWN:
      if event.key == K_LEFT:
        keys_pressed_list.append("left")
      if event.key == K_RIGHT:
        keys_pressed_list.append("right")
      if event.key == K_UP:
        keys_pressed_list.append("up")
      if event.key == K_DOWN:
        keys_pressed_list.append("down")
      if event.key == K_a:
        keys_pressed_list.append("a")
      if  event.key == K_d:
        keys_pressed_list.append("b")
      if event.key == K_w:
        keys_pressed_list.append("w")
      if event.key == K_s:
        keys_pressed_list.append("s")
      if event.key == K_SPACE:
        keys_pressed_list.append("space")
      if event.key == K_q:
        keys_pressed_list.append("q")
      if event.key == K_e:
        keys_pressed_list.append("e")
    if event.type == pygame.MOUSEBUTTONDOWN:
      keys_pressed_list.append("click")
      return (keys_pressed_list, event.pos)
  return keys_pressed_list

我希望如果我可以做类似的事情:

while True:
  Variable1 = get_pygame_events()
  Variable2 = get_keys_pressed()
  if Variable2 == ["w"]:
    print("w")

(P.S。:while循环只是我所做的总结) 然后,如果我按住W,那么W会一遍又一遍地打印出来,相反,当我尝试时,它会打印W一次。除非我再次按下,否则就会发生这一切。 如何通过按住W(或任何)键来识别发生的事件,并且(在这种情况下)每次通过while循环时都会打印出来?

4 个答案:

答案 0 :(得分:10)

使用pygame.KEYDOWNpygame.KEYUP检测是否物理按下或释放了某个键。您可以使用pygame.key.set_repeat激活键盘重复,以便在按住某个键时生成多个pygame.KEYDOWN事件,但这很少是一个好主意。

相反,您可以使用pygame.key.get_pressed()检查当前是否按下了某个键:

while True:
    ...
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_w]:
       print("w is pressed")
    if pressed[pygame.K_s]:
       print("s is pressed")

答案 1 :(得分:4)

event.key == chr('a') 

event.key返回键的ascii

答案 2 :(得分:2)

我建议你坚持使用事件驱动的方法而不是使用轮询机制。

你应该让关键事件改变一些内部状态以反映按下的键imo。

示例:您正在使用键盘控制太空飞船。当你按下“w”,“s”,“a”或“d”中的一个以使船在某个方向上加速时,你希望推进火箭发射:

  • 在pygame.KEYDOWN事件中,如果[K_w,K_s,K_a,K_d]中有event.key,则为对象设置适当的加速度矢量。
  • 在pygame.KEYUP事件中,如果[K_w,K_s,K_a,K_d]中的event.key,则将加速度向量设置为零向量。

这将有效地使对象在按下移动键时加速,并在释放按键时停止加速。

答案 3 :(得分:1)

使用pygame.key.set_repeat()。

  

set_repeat(延迟,间隔) - >无。

     

启用键盘重复时,按下的键将生成多个pygame.KEYDOWN事件。延迟是第一次重复发送pygame.KEYDOWN之前的毫秒数。之后,每隔一个毫秒发送另一个pygame.KEYDOWN。如果没有传递参数,则禁用密钥重复。