如何使用pygame.KEYDOWN

Lor*_*riX 3 python events pygame keydown

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

def get_pygame_events():
  pygame_events = pygame.event.get()
  return pygame_events
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

while True:
  Variable1 = get_pygame_events()
  Variable2 = get_keys_pressed()
  if Variable2 == ["w"]:
    print("w")
Run Code Online (Sandbox Code Playgroud)

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

slo*_*oth 11

使用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")
Run Code Online (Sandbox Code Playgroud)


小智 5

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

在我看来,您应该让按键事件改变一些内部状态以反映按下的按键。

示例:您正在用键盘控制一艘宇宙飞船。您希望当您按下“w”、“s”、“a”或“d”之一以使飞船朝某个方向加速时,推进火箭就会发射:

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

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