事件循环
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 中有两种类型的关键事件:KEYDOWN
和 KEYUP
。这些事件有一个属性 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 MOUSEMOTION
,MOUSEBUTTONDOWN
和 MOUSEBUTTONUP
中有三种类型的鼠标事件。Pygame 将在设置显示模式时注册这些事件。
**** 当用户在显示器中移动他或她的鼠标时接收 MOUSEMOTION
。它具有 buttons
,pos
和 rel
的属性。
buttons
是一个元组,表示鼠标按钮(left
,mouse-wheel
,right
)是否被按下。pos
是光标的绝对位置(x
,y
),以像素为单位。rel
是相对于前一个位置(rel_x
,rel_y
)的位置,以像素为单位。
**** 当用户按下或释放鼠标按钮时,接收 MOUSEBUTTONDOWN
和 MOUSEBUTTONUP
。他们有 button
和 pos
的属性。
button
是一个表示按下按钮的整数。1
表示左键,2 表示鼠标滚轮,3
表示右键。pos
是用户按下鼠标按钮时鼠标(x
,y
)的绝对位置。
例
以下是使用每个鼠标事件的一些属性的简短示例:
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.MOUSEBUTTONDOWN
和 pygame.MOUSEBUTTONUP
事件。