pygame-理解事件
event = pygame.event.get() 返回当前全部事件队列并从队列中删除事件
不管当前有事件还是无事件,都会继续往下执行
可以指定需要获取的事件类型
返回值是列表
import pygame,time pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("处理事件") while True: time.sleep(1) event = pygame.event.get(pygame.KEYDOWN) #从队列中获取键盘按下事件 print(event)
event = pygame.event.wait() 等待事件的发生,有事件发生就继续往下执行,无事件发生就一直等待
import pygame pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("处理鼠标事件") i=0 while True: event = pygame.event.wait() #等待事件的发生并返回事件 if event.type == pygame.QUIT: exit() str1=str(event) print(i,str1) i=i+1 pass
pygame.event.set_blocked() 控制哪些事件禁止进入队列
如果传入 None,则表示禁止所有的事件进入队列
import pygame,time pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("处理事件") pygame.event.set_blocked((pygame.MOUSEMOTION,pygame.MOUSEBUTTONDOWN)) #禁止鼠标移动和鼠标按下事件进入队列 while True: event = pygame.event.wait() print(event) #此程序运行时,鼠标移动和鼠标按下事件没有被打印,说明被禁止了
pygame.event.set_allowed() 控制哪些事件允许进入队列
import pygame,time pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("处理事件") pygame.event.set_blocked(None) pygame.event.set_allowed((pygame.MOUSEBUTTONDOWN,pygame.KEYDOWN)) # 允许鼠标按下和键盘按下事件进入队列 #这条语句的作用是把前面禁止进入队列的事件再允许进入队列 #如果传入 None,则表示允许所有的事件进入队列 while True: time.sleep(1) event = pygame.event.get() print(event)
pygame.event.pump() 让 Pygame内部自动处理事件
pygame.event.poll() 从队列中获取一个事件
从队列中返回并删除一个事件。如果事件队列为空,那么会立刻返回类型为 pygame.NOEVENT 的事件
import pygame,time pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("处理事件") while True: time.sleep(2) event = pygame.event.poll() #从队列中获取一个事件 print(event) #此程序运行时,你可以快速产生一些事件,可以看到每2秒打印出一个事件
pygame.event.peek() 检测某类型事件是否在队列中
import pygame,time pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("处理事件") while True: time.sleep(1) event = pygame.event.peek((pygame.MOUSEBUTTONDOWN,pygame.KEYDOWN)) #检测鼠标按下事件或键盘按下事件是否在队列中 #如果队列中没有指定的事件就返回0,有就返回1。如果指定了多个事件类型,只要有一个就返回1 #注意:不会删除事件 print(event)
pygame.event.clear() 从队列中删除所有的事件
从队列中删除所有的事件,如果通过参数指定事件的类型,则删除该类型的所有事件。该函数的效果跟 pygame.event.get() 相同,只是没有返回任何东西
常用事件集:
事件 | 产生途径 | 参数 |
QUIT | 用户按下关闭按钮 | none |
ATIVEEVENT | Pygame被激活或者隐藏 | gain, state |
KEYDOWN | 键盘被按下 | unicode, key, mod |
KEYUP | 键盘被放开 | key, mod |
MOUSEMOTION | 鼠标移动 | pos, rel, buttons |
MOUSEBUTTONDOWN | 鼠标按下 | pos, button |
MOUSEBUTTONUP | 鼠标放开 | pos, button |
JOYAXISMOTION | 游戏手柄(Joystick or pad)移动 | joy, axis, value |
JOYBALLMOTION | 游戏球(Joy ball)移动 | joy, axis, value |
JOYHATMOTION | 游戏手柄(Joystick)移动 | joy, axis, value |
JOYBUTTONDOWN | 游戏手柄按下 | joy, button |
JOYBUTTONUP | 游戏手柄放开 | joy, button |
VIDEORESIZE | Pygame窗口缩放 | size, w, h |
VIDEOEXPOSE | Pygame窗口部分公开(expose) | none |
USEREVENT | 触发了一个用户事件 | code |
处理鼠标事件:
MOUSEMOTION事件会在鼠标移动时发生,它有三个参数:
buttons:一个含有三个数字的元组,三个值分别代表左键、中键和右键,1就是按下了。
pos:鼠标光标的位置--相对于pygame窗口的坐标
rel:代表了现在距离上次产生鼠标事件时的距离(横坐标方向距离,纵坐标方向距离)--正负表示方向
MOUSEBUTTONDOWN 鼠标按下时发生,它有两个参数:
pos:鼠标光标的位置--相对于pygame窗口的坐标
button:1代表左键,2代表中键,3代表右键
MOUSEBUTTONUP 鼠标释放时发生,它有两个参数:
pos:鼠标光标的位置--相对于pygame窗口的坐标
button:1代表左键,2代表中键,3代表右键
滚轮的滚动:
滚轮的滚动也会产生MOUSEBUTTONDOWN和MOUSEBUTTONUP事件,如果向上滚动button属性返回4,如果向下滚动button属性返回5
import pygame pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("处理鼠标事件") i=0 while True: event = pygame.event.wait() #等待事件的发生并返回事件 if event.type == pygame.QUIT: exit() if event.type == pygame.MOUSEMOTION: zuobiao=event.pos #返回鼠标当前坐标值(x,y)--元组,相对于窗口左上角 print(i,'坐标为:',zuobiao,type(zuobiao)) #event.rel 鼠标相对运动距离(X, Y),相对于上次事件 #event.buttons 鼠标按钮状态(a,b,c),对应于鼠标的三个键 pass if event.type == pygame.MOUSEBUTTONDOWN: print(i,'鼠标键按下了',event) if event.type == pygame.MOUSEBUTTONUP: print(i,'鼠标键释放了',event) i=i+1 pass
处理键盘事件:
键盘和游戏手柄的事件比较类似,为KEYDOWN和KEYUP
import pygame pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("处理事件") x, y = 0, 0 i=0 while True: event = pygame.event.wait() if event.type == pygame.QUIT: exit() if event.type == pygame.KEYDOWN: #如果有键盘按下 if event.key == pygame.K_LEFT: #如果按下是向左键 x = -1 if event.key == pygame.K_RIGHT: #如果按下是向右键 x = 1 if event.key == pygame.K_UP: #如果按下是向上键 y = -1 if event.key == pygame.K_DOWN: #如果按下是向下键 y = 1 print(i,event,x,y) elif event.type == pygame.KEYUP: #如果有键盘释放 print('有键释放',event) i=i+1 pass
unicode -代表了按下键的Unicode值
key -按下或者放开的键值,是一个数字,Pygame中可以使用K_xxx来表示,比如字母a就是K_a,还有K_SPACE和K_RETURN等,具体看:https://blog.csdn.net/mouday/article/details/80457220
mod -包含了组合键信息,如果mod & KMOD_CTRL是真值,表示用户同时按下了Ctrl键。类似的还有KMOD_SHIFT,KMOD_ALT
按键和组合键实例:
import pygame pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("组合键练习") i=0 while True: event = pygame.event.wait() if event.type == pygame.QUIT: exit() if event.type == pygame.KEYDOWN: #如果有键盘按下 if event.key == pygame.K_LEFT: #如果按下是向左键 print(i,'向左键') if event.key == pygame.K_w: #如果按下是w键 print(i,'w键') if event.key == pygame.K_LCTRL: #如果按下是左CTRL键 print(i,'左CTRL') if event.key == pygame.K_RCTRL: #如果按下是右CTRL键 print(i,'右CTRL') if event.mod & pygame.KMOD_CTRL: #如果按下了CTRL键 print(i,'CTRL') if event.mod & pygame.KMOD_CTRL and event.key == pygame.K_a: #如果按下了CTRL键+a键 print(i,'CTRL+a') if event.mod & pygame.KMOD_CTRL |pygame.KMOD_ALT and event.key == pygame.K_a: #如果按下了CTRL键+ALT键+a键 print(i,'CTRL+ALT+a') i+=1 pass