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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
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) #此程序运行时,鼠标移动和鼠标按下事件没有被打印,说明被禁止了
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
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)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
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)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
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:代表了现在距离上次产生鼠标事件时的距离(横坐标方向距离,纵坐标方向距离)--正负表示方向 ![pygame-理解事件_鼠标移动_02](http://image109.360doc.com/DownloadImg/2022/08/2816/251058764_1_20220828045255647.png)
MOUSEBUTTONDOWN 鼠标按下时发生,它有两个参数: pos:鼠标光标的位置--相对于pygame窗口的坐标 button:1代表左键,2代表中键,3代表右键 ![pygame-理解事件_鼠标事件_03](http://image109.360doc.com/DownloadImg/2022/08/2816/251058764_2_20220828045259757.png)
MOUSEBUTTONUP 鼠标释放时发生,它有两个参数: pos:鼠标光标的位置--相对于pygame窗口的坐标 button:1代表左键,2代表中键,3代表右键 ![pygame-理解事件_鼠标事件_04](http://image109.360doc.com/DownloadImg/2022/08/2816/251058764_3_20220828045259991.png)
滚轮的滚动: 滚轮的滚动也会产生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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
处理键盘事件:键盘和游戏手柄的事件比较类似,为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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
![pygame-理解事件_处理事件_05](http://image109.360doc.com/DownloadImg/2022/08/2816/251058764_4_2022082804530053.png)
unicode -代表了按下键的Unicode值 key -按下或者放开的键值,是一个数字,Pygame中可以使用K_xxx来表示,比如字母a就是K_a,还有K_SPACE和K_RETURN等,具体 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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
![pygame-理解事件_鼠标移动_06](http://image109.360doc.com/DownloadImg/2022/08/2816/251058764_5_20220828045300210.png)
|