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()