国家检查

可以从 pygame.keypygame.mouse 模块调用函数来接收键和鼠标的状态。但是,这不是在 pygame 中处理事件的推荐方法,因为它存在一些缺陷:

  • 调用该函数时,你将收到状态,这意味着如果用户快速按下按钮,你可能会错过调用之间的事件。

  • 你无法确定事件的顺序。

  • 你仍然需要调用 pygame 的一个事件函数来进行 pygame 内部与操作系统的交互,否则它会警告程序没有响应。你可以调用的功能是:

    • pygame.event.get() 从队列中获取所有事件或事件类型(通过将类型作为参数传递)。
    • pygame.event.poll() 从队列中获取一个单一事件。
    • pygame.event.wait() 等待队列中的一个事件。
    • pygame.event.clear() 清除队列中的所有事件。
    • pygame.event.pump() 允许 pygame 处理内部动作(由上面的函数隐式调用)。

键盘事件

密钥模块有一个函数 pygame.key.get_pressed(),它返回所有密钥状态的列表。该列表包含所有未按下的键的 0 和所有按下的键的 1。它在列表中的索引由 pygame 模块中的常量定义,所有常量都以 K_ 和键名为前缀。

pygame.event.pump()  # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_a]:
    print("You pressed 'a'")
if key[pygame.K_F1]:
    print("You pressed 'F1'")
if key[pygame.K_LSHIFT]:
    print("You pressed 'left shift'")
if key[pygame.K_q]:  # Press 'q' to exit the program
    quit()

如果要检查单个按键而不是按住键,则可以将所有键的先前状态存储在临时变量中,并检查值是否更改:

pygame.event.pump()  # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_q] and not previous_key[pygame.K_q]:
    print("You pressed 'q'")
if key[pygame.K_p] and not previous_key[pygame.K_p]:
    print("You pressed 'p'")
previous_key = key

仅当按下当前键并且未按下前一个键时,语句才会计算为 true。要检查用户是否已释放密钥,你只需切换 not 关键字(if not key[pygame.K_q] and previous_key[pygame.K_q])。为了使其正常工作,你必须在游戏循环之前设置变量 previous_key = pygame.key.get_pressed(),否则你将收到一个 NameError

鼠标事件

鼠标模块具有允许我们检查和设置鼠标位置以及检查按下按钮的功能。函数 pygame.mouse.get_pressed() 返回一个元组元组,表示是否按下鼠标按钮(左,鼠标滚轮,右)。

pygame.event.pump()  # Allow pygame to handle internal actions.
mouse_pos = pygame.mouse.get_pos()
mouse_buttons = pygame.mouse.get_pressed()
if mouse_pos[0] > 100:
    pygame.mouse.set_pos(10, mouse_pos[1])  # Reset the mouse's x-position to 10.
    print("YOU SHALL NOT PASS!")
if mouse_buttons[2]:
    print("I'm right, right?")
if mouse_buttons[0]:  # Press left mouse button to exit.
    print("Program left")
    quit()