Pygame事件处理机制简介
• 键盘事件及类型的使用
• 鼠标事件及类型的使用
• Pygame事件处理函数
Pygame事件队列
缓存并派发所有事件
原则上先到先处理
用户对事件逐一处理
Pygame事件
pygame.event.EventType
• 事件本质上是一种封装后的数据类型(对象)
• EventType是Pygame的一个类,表示事件类型
• 事件类型只有属性,没有方法
• 用户可自定义新的事件类型
事件类型 | 对应常量 |
---|---|
系统 | QUIT(none), |
系统 | ACTIVEEVENT(gain, state) |
键盘 | KEYDOWN(unicode, key, mod) |
键盘 | KEYUP(key, mod) |
鼠标 | MOUSEMOTION(pos, rel, buttons) |
鼠标 | MOUSEBUTTONUP(pos, button) |
鼠标 | MOUSEBUTTONDOWN(pos, button) |
游戏杆 | JOYAXISMOTION(joy, axis, value) |
游戏杆 | JOYBALLMOTION joy, ball, rel |
游戏杆 | JOYHATMOTION joy, hat, value |
游戏杆 | JOYBUTTONUP joy, button |
游戏杆 | JOYBUTTONDOWN joy, button |
窗口 | VIDEORESIZE size, w,h |
窗口 | VIDEOEXPOSE none |
用户定义 | USEREVENT code |
实例:键盘落下事件及属性
pygame.event.KEYDOWN
event.unicode
• event.key
• event.mod
键盘事件及属性
键盘按下事件pygame.event.KEYDOWN
键盘释放事件pygame.event.KEYUP
event.unicode 按键的unicode码,平台有关,不推荐使用
event.key 按键的常量名称
event.mod 按键修饰符的组合值
按键的常量名称
K_BACKSPACE
K_TAB
K_CLEAR
K_RETURN
K_PAUSE
K_ESCAPE
K_SPACE
K_EXCLAIM
K_QUOTEDBL
K_HASH
K_COLON
K_SEMICOLON
K_LESS
K_EQUALS
K_GREATER
K_QUESTION
K_AT
K_LEFTBRACKET
K_BACKSLASH
K_RIGHTBRACKET
K_CARET
K_0
K_1
K_2
K_3
K_4
K_5
K_6
K_7
K_8
K_9
K_DOLLAR
K_AMPERSAND
K_QUOTE
K_LEFTPAREN
K_RIGHTPAREN
K_ASTERISK
K_PLUS
K_COMMA
K_MINUS
K_PERIOD
K_SLASH
K_UNDERSCORE
K_BACKQUOTE
K_DELETE
K_UP
K_DOWN
K_RIGHT
K_LEFT
K_INSERT
K_HOME
K_END
K_KP0
K_KP1
K_KP2
K_KP3
K_KP4
K_KP5
K_KP6
K_KP7
K_KP8
K_KP9
K_KP_PERIOD
K_KP_DIVIDE
K_KP_MULTIPLY
K_KP_MINUS
K_KP_PLUS
K_KP_ENTER
K_KP_EQUALS
K_PAGEUP
K_PAGEDOWN
K_NUMLOCK
K_F1
K_F2
K_F3
K_F4
K_F5
K_F6
K_F7
K_F8
K_F9
K_F10
K_F11
K_F12
K_F13
K_F14
K_F15
K_CAPSLOCK
K_SCROLLOCK
K_RSHIFT
K_LSHIFT
K_RCTRL
K_LCTRL
K_RALT
K_LALT
K_RMETA
K_LMETA
K_LSUPER
K_RSUPER
K_MODE
K_HELP
K_PRINT
K_SYSREQ
K_BREAK
K_MENU
K_POWER
K_EURO
K_a
K_b
K_c
K_d
K_e
K_f
K_g
K_h
K_i
K_j
K_k
K_l
K_m
K_n
K_o
K_p
K_q
K_r
K_s
K_t
K_u
K_v
K_w
K_x
K_y
K_z
按键的修饰符
KMOD_NONE
KMOD_LSHIFT
KMOD_RSHIFT
KMOD_SHIFT
KMOD_CAPS
KMOD_LCTRL
KMOD_RCTRL
KMOD_CTRL
KMOD_LALT
KMOD_RALT
KMOD_ALT
KMOD_LMETA
KMOD_RMETA
KMOD_META
KMOD_NUM
KMOD_MODE
修饰符的按位或运算
event.mod = KMOD_ALT | KMOD_SHIFT
鼠标事件及属性
pygame.event.MOUSEMOTION鼠标移动事件
event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
event.rel 鼠标相对运动距离(X,Y),相对于上次事件
event.buttons 鼠标按钮状态(a,b,c),对应于鼠标的三个键
pygame.event.MOUSEBUTTONUP鼠标键释放事件
event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
event.button 鼠标按下键编号n取值 0/1/2,分别对应三个键
pygame.event.MOUSEBUTTONDOWN 鼠标键按下事件
event.pos 鼠标当前坐标值(x,y),相对于窗口左上角
event.button 鼠标按下键编号n取值为整数,左键为1,右键为3,设备相关
事件处理的重要函数
处理事件
pygame.event.get(type/typelist)
从事件队列中获得事件列表,即获得所有被队列的事件
pygame.event.poll()
从事件队列中获得一个事件,事件获取将从事件队列中删除
pygame.event.clear(type/typelist)
从事件队列中删除事件,默认删除所有事件
如果事件队列为空,则返回 event.NOEVENT
操作事件队列
同时仅能存储128个事件当队列满时,更多事件将被丢弃
设置事件队列能够缓存事件的类型
pygame.event.set_blocked(type or typelist)
控制哪些类型事件不允许被保存到事件队列中
pygame.event.get_blocked(type)
测试某个事件类型是否被事件队列所禁止
如果事件类型被禁止,则返回True,否则返回False
pygame.event.set_allowed(type or typelist)
控制哪些类型事件允许被保存到事件队列中
生成事件
pygame.event.post(Event)
产生一个事件,并将其放入事件队列
一般用于放置用户自定义事件(pygame.USEREVENT)
也可以用于放置系统定义事件(如鼠标或键盘等),给定参数
pygame.event.Event((type, dict) 创建一个给定类型的事件
其中,事件的属性和值采用字典类型复制,属性名采用字符串形式
如果创建已有事件,属性需要一致
代码示例
处理事件
# -*- coding: utf-8 -*-
# @File : pygame_demo.py
# @Date : 2018-05-22
"""
键盘鼠标事件
"""
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("pygame游戏之旅")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 监听键盘按下事件,打印出所按的键位信息
if event.type == pygame.KEYDOWN:
if event.unicode =="":
print("#", event.key, event.mod)
else:
print(event.unicode, event.key, event.mod)
# 监听鼠标事件,打印鼠标位置信息
elif event.type == pygame.MOUSEMOTION:
print("MOUSEMOTION", event.pos, event.rel, event.buttons)
elif event.type == pygame.MOUSEBUTTONDOWN:
print("MOUSEBUTTONDOWN", event.pos, event.button)
elif event.type == pygame.MOUSEBUTTONUP:
print("MOUSEBUTTONUP", event.pos, event.button)
pygame.display.update()
产生事件
# -*- coding: utf-8 -*-
# @File : pygame_demo.py
# @Date : 2018-05-22
"""
产生事件
"""
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("pygame游戏之旅")
fps = 1
fclock = pygame.time.Clock()
num = 1
while True:
# 生成事件并插入事件队列
uevent = pygame.event.Event(
pygame.KEYDOWN,
{"unicode": 123, "key": pygame.K_SPACE, "mod": pygame.KMOD_LALT}
)
pygame.event.post(uevent)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.unicode == "":
print("[KEYDOWN {}]:".format(num), "#", event.key, event.mod)
else:
print("[KEYDOWN {}]:".format(num), event.unicode, event.key, event.mod)
pygame.display.update()