事件循环

Pygame 会将用户的所有事件注册到一个事件队列中,该事件队列可以使用代码 pygame.event.get() 接收。此队列中的每个元素都是 Event 对象,它们都具有属性 type,这是一个整数,表示它是什么类型的事件。在 pygame 模块中,有预定义的整数常量表示类型。除此属性外,事件具有不同的属性。

常名 属性
放弃 没有
ACTIVEEVENT 获得,状态
KEYDOWN unicode,key,mod
KEYUP 键,mod
MOUSEMOTION pos,rel,buttons
MOUSEBUTTONUP pos,按钮
MOUSEBUTTONDOWN pos,按钮
JOYAXISMOTION 快乐,轴,价值
JOYBALLMOTION 快乐,球,相对
JOYHATMOTION 快乐,帽子,价值
JOYBUTTONUP 快乐,按钮
JOYBUTTONDOWN 快乐,按钮
VIDEORESIZE 大小,w,h
VIDEOEXPOSE 没有
USEREVENT

要处理我们的事件,我们只需循环遍历队列,检查它是什么类型(借助 pygame 模块中的预定义常量),然后执行一些操作。此代码将检查用户是否按下了显示屏顶角的关闭按钮,如果是,则终止程序。

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        # Close the program any way you want, or troll users who want to close your program.
        raise SystemExit

注意 :使用 pygame 时,你必须定期调用事件队列! 除了获取可用事件之外,调用事件队列也是 pygame 在内部与操作系统交互的方式。如果未定期调用事件队列,则操作系统将假定你的程序不再正常工作,并且可能使程序看起来像程序崩溃(在 Windows 中窗口变为白色)。如果你不想对事件做任何事情,你应该在每个游戏循环中调用 pygame.event.pump() 以使 pygame 在内部处理事件。

键盘事件

pygame 中有两种类型的关键事件:KEYDOWNKEYUP。这些事件有一个属性 key,它是一个表示键盘上键的整数。pygame 模块具有表示所有公共密钥的预定义整数常量。常量以大写 K,下划线和键的名称命名。例如, <- 名为 K_BACKSPACE,a 名为 K_a,F4 是 namned K_F4

此代码将检查用户是否已经按下 w,a,s 或 d。

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # Usually wise to be able to close your program.
        raise SystemExit
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
            print("Player moved up!")
        elif event.key == pygame.K_a:
            print("Player moved left!")
        elif event.key == pygame.K_s:
            print("Player moved down!")
        elif event.key == pygame.K_d:
            print("Player moved right!")

修饰符

大写字母没有整数常量。相反,关键事件有称为 mod 另一个属性,它是改性剂( shift,ctrl,alt 等)被同时按下的键。mod 属性是一个表示被按下的修饰符的整数。每个修饰符的整数值都存储在 pygame 模块中,名称为 KMOD_ 及其名称。例如,Left shift 名为 KMOD_LSHIFT,Tab 名为 KMOD_TAB,Ctrl 名为 KMOD_CTRL

此代码将检查用户按下 a,Left shift + a 或 Caps + a。

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # It's still wise to be able to close your program.
        raise SystemExit
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_a:
            if event.mod == 0:  # No modifier.
                print("You pressed 'a'")
            elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS:
                print("You pressed 'A'")
            else:
                print("You pressed 'a' with another modifier than right shift or caps.")

鼠标事件

pygame MOUSEMOTIONMOUSEBUTTONDOWNMOUSEBUTTONUP 中有三种类型的鼠标事件。Pygame 将在设置显示模式时注册这些事件。

**** 当用户在显示器中移动他或她的鼠标时接收 MOUSEMOTION 。它具有 buttonsposrel 的属性。

  • buttons 是一个元组,表示鼠标按钮(leftmouse-wheelright)是否被按下。
  • pos 是光标的绝对位置(xy),以像素为单位。
  • rel 是相对于前一个位置(rel_xrel_y)的位置,以像素为单位。

**** 当用户按下或释放鼠标按钮时,接收 MOUSEBUTTONDOWNMOUSEBUTTONUP 。他们有 buttonpos 的属性。

  • button 是一个表示按下按钮的整数。1 表示左键,2 表示鼠标滚轮,3 表示右键。
  • pos 是用户按下鼠标按钮时鼠标(xy)的绝对位置。

以下是使用每个鼠标事件的一些属性的简短示例:

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # Close your program if the user wants to quit.
        raise SystemExit
    elif event.type == pygame.MOUSEMOTION:
        if event.rel[0] > 0:  # 'rel' is a tuple (x, y). 'rel[0]' is the x-value.
            print("You're moving the mouse to the right")
        elif event.rel[1] > 0:  # pygame start y=0 at the top of the display, so higher y-values are further down.
            print("You're moving the mouse down")
    elif event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 1:
            print("You pressed the left mouse button")
        elif event.button == 3:
            print("You pressed the right mouse button")
    elif event.type == pygame.MOUSEBUTTONUP:
        print("You released the mouse button")

由于 pygame 模块中没有鼠标按钮属性的预定义常量,因此以下是每个的值:

按键
鼠标左键 1
鼠标滚轮按钮 2
鼠标右键 3
鼠标滚轮向上滚动 4
鼠标滚轮向下滚动

滚动鼠标按钮将生成 pygame.MOUSEBUTTONDOWNpygame.MOUSEBUTTONUP 事件。