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