如何在按住按键时,通过循环每次执行pygame.KEYDOWN?

6 投票
4 回答
113458 浏览
提问于 2025-04-18 18:30

我写了两个函数,用来检查一个事件

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")

(那个 while 循环只是我做的事情的总结)

所以我想,如果我按住 W 键,"w" 应该会一直被打印出来。但是当我试的时候,只打印了一次 W,除非我再按一次,不然就不会再有任何反应。

我该怎么做才能让按住 W(或者其他任何)键时,能够识别到这个事件,并且在每次循环 while 的时候都打印 "w" 呢?

4 个回答

1

使用 pygame.key.set_repeat()。

set_repeat(delay, interval) -> None。

当键盘重复功能开启时,按住的键会产生多个 pygame.KEYDOWN 事件。delay 是指在第一次重复的 pygame.KEYDOWN 事件发送之前的等待时间,单位是毫秒。之后,每隔 interval 毫秒就会发送一次 pygame.KEYDOWN 事件。如果不传任何参数,键盘重复功能就会被关闭。

4
event.key == chr('a') 

event.key 返回的是按键的 ASCII 码

5

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

你应该让按键事件改变一些内部状态,以反映出哪个键被按下了。

举个例子:假设你在用键盘控制一艘宇宙飞船。你希望当你按下'w'、's'、'a'或'd'其中一个键时,推进火箭就能启动,让飞船朝某个方向加速:

  • 当检测到pygame.KEYDOWN事件时,如果按下的键是[K_w, K_s, K_a, K_d]中的一个,就为这个物体设置一个合适的加速向量。
  • 当检测到pygame.KEYUP事件时,如果按下的键是[K_w, K_s, K_a, K_d]中的一个,就把加速向量设置为零。

这样的话,物体在按住移动键的时候就会加速,而当松开键的时候就会停止加速。

19

使用 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")

撰写回答