如何在按住按键时,通过循环每次执行pygame.KEYDOWN?
我写了两个函数,用来检查一个事件
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 个回答
使用 pygame.key.set_repeat()。
set_repeat(delay, interval) -> None。
当键盘重复功能开启时,按住的键会产生多个 pygame.KEYDOWN 事件。delay 是指在第一次重复的 pygame.KEYDOWN 事件发送之前的等待时间,单位是毫秒。之后,每隔 interval 毫秒就会发送一次 pygame.KEYDOWN 事件。如果不传任何参数,键盘重复功能就会被关闭。
event.key == chr('a')
event.key 返回的是按键的 ASCII 码
我建议你使用事件驱动的方法,而不是轮询机制。
你应该让按键事件改变一些内部状态,以反映出哪个键被按下了。
举个例子:假设你在用键盘控制一艘宇宙飞船。你希望当你按下'w'、's'、'a'或'd'其中一个键时,推进火箭就能启动,让飞船朝某个方向加速:
- 当检测到pygame.KEYDOWN事件时,如果按下的键是[K_w, K_s, K_a, K_d]中的一个,就为这个物体设置一个合适的加速向量。
- 当检测到pygame.KEYUP事件时,如果按下的键是[K_w, K_s, K_a, K_d]中的一个,就把加速向量设置为零。
这样的话,物体在按住移动键的时候就会加速,而当松开键的时候就会停止加速。
使用 pygame.KEYDOWN
和 pygame.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")