Pygame Event事件模塊的詳細示例
事件(Event)是 Pygame 的重要模塊之一,它是構建整個遊戲程序的核心,比如鼠標點擊、鍵盤敲擊、遊戲窗口移動、調整窗口大小、觸發特定的情節、退出遊戲等等,這些都可以看做是“事件”,Pygame 會接受用戶產生的各種操作(或事件),這些操作隨時產生,並且操作量可大可小,那麼 Pygame 是如何處理這些事件的呢?
事件類型
Pygame 定義瞭一個專門用來處理事件的結構,即事件隊列,該結構遵循遵循隊列“先到先處理”的基本原則,通過事件隊列,我們可以有序的、逐一的處理用戶的操作(觸發事件)。下述表格列出瞭 Pygame 中常用的遊戲事件:
事件類型 | 描述 | 成員屬性 |
---|---|---|
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 | 觸發一個用戶事件 | 事件代碼 |
註意,當使用 Pygame 做遊戲開發時,上述事件並非都會應用的到,因此在學習的過程中,我們要懂得觸類旁通、舉一反三。
事件處理方法
Pygame.event 模塊提供瞭處理事件隊列的常用方法,如下表所示:
方法 | 說明 |
---|---|
pygame.event.get() | 從事件隊列中獲取一個事件,並從隊列中刪除該事件 |
pygame.event.wait() | 阻塞直至事件發生才會繼續執行,若沒有事件發生將一直處於阻塞狀態 |
pygame.event.set_blocked() | 控制哪些事件禁止進入隊列,如果參數值為None,則表示禁止所有事件進入 |
pygame.event.set_allowed() | 控制哪些事件允許進入隊列 |
pygame.event.pump() | 調用該方法後,Pygame 會自動處理事件隊列 |
pygame.event.poll() | 會根據實際情形返回一個真實的事件,或者一個None |
pygame.event.peek() | 檢測某類型事件是否在隊列中 |
pygame.event.clear() | 從隊列中清除所有的事件 |
pygame.event.get_blocked() | 檢測某一類型的事件是否被禁止進入隊列 |
pygame.event.post() | 放置一個新的事件到隊列中 |
pygame.event.Event() | 創建一個用戶自定義的新事件 |
當我們使用 Pygame 處理事件時,邏輯一般都是相似的。首先是判斷事件的類型,然後根據不同的事件操作,執行不同的遊戲操作。因此這種情況非常適合使用 if … else 語句。如下所示:
while True: #等待事件發生 event = pygame.event.wait() if event.type == pygame.QUIT: exit() if event.type == pygame.MOUSEBUTTONDOWN: print('鼠標按下',event.pos) if event.type == pygame.MOUSEBUTTONUP: print('鼠標彈起') if event.type == pygame.MOUSEMOTION: print('鼠標移動') # 鍵盤事件 if event.type ==pygame.KEYDOWN: # 打印按鍵的英文字符 print('鍵盤按下',chr(event.key)) if event.type == pygame.KEYUP: print('鍵盤彈起') ....
下面應用上述方法對鼠標事件和鍵盤事件分別做簡單的介紹。
處理鍵盤事件
鍵盤事件會涉及到大量的按鍵操作,比如遊戲中的上下左右,或者人物的前進、後退等操作,這些都需要鍵盤來配合實現。
鍵盤事件提供瞭一個 key 屬性,通過該屬性可以獲取鍵盤的按鍵。Pygame 將鍵盤上的字母鍵、數字鍵、組合鍵等按鍵以常量的方式進行瞭定義,下表列出瞭部分常用按鍵的常量:
常量名 | 描述 |
---|---|
K_BACKSPACE | 退格鍵(Backspace) |
K_TAB | 制表鍵(Tab) |
K_CLEAR | 清除鍵(Clear) |
K_RETURN | 回車鍵(Enter) |
K_PAUSE | 暫停鍵(Pause) |
K_ESCAPE | 退出鍵(Escape) |
K_SPACE | 空格鍵(Space) |
K_0…K_9 | 0…9 |
K_a…Kz | a…z |
K_DELETE | 刪除鍵(delete) |
K_KP0…K_KP9 | 0(小鍵盤)…9(小鍵盤) |
K_F1…K_F15 | F1…F15 |
K_UP | 向上箭頭(up arrow) |
K_DOWN | 向下箭頭(down arrow) |
K_RIGHT | 向右箭頭(right arrow) |
K_LEFT | 向左箭頭(left arrow) |
KMOD_ALT | 同時按下Alt鍵 |
想要瞭解更多按鍵常量可參考官方文檔,這裡有您想要的更多知識 ———> 點擊前往。
下面通過“圖片移動”示例來瞭解鍵盤事件的處理過程,如下所示:
import pygame import sys # 初始化pygame pygame.init() # 定義變量 size = width, height = 600, 400 bg = (255, 255, 255) # 加載logo圖 img = pygame.image.load("C:/Users/Administrator/Desktop/logo.jpg") # 獲取圖像的位置 position = img.get_rect() # 創建一個主窗口 screen = pygame.display.set_mode(size) # 標題 pygame.display.set_caption("C語言中文網") # 創建遊戲主循環 while True: # 設置初始值 site = [0, 0] for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 圖像移動 KEYDOWN 鍵盤按下事件 # 通過 key 屬性對應按鍵 if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: site[1] -= 8 if event.key == pygame.K_DOWN: site[1] += 8 if event.key == pygame.K_LEFT: site[0] -= 8 if event.key == pygame.K_RIGHT: site[0] += 8 # 移動圖像 position = position.move(site) # 填充背景 screen.fill(bg) # 放置圖片 screen.blit(img, position) # 更新顯示界面 pygame.display.flip()
程序運行結果如下:
圖1:Pygame鍵盤事件——圖像移動
處理鼠標事件
鼠標是計算機最重要外接設備之一,同時它也是遊戲玩傢必不可少的工具之一。
Pygame 提供瞭三個鼠標事件,分別是鼠標移動(MOUSEMOTION)、鼠標按下(MOUSEBUTTONDOWN)、鼠標釋放(MOUSEBUTTONUP),不同事件類型對應著不同的成員屬性。如下所示:
pygame.event.MOUSEMOTION鼠標移動事件
event.pos 相對於窗口左上角,鼠標的當前坐標值(x,y)
event.rel 鼠標相對運動距離(X,Y),相對於上次事件
event.buttons 鼠標按鈕初始狀態(0,0,0),分別對應(左鍵,滑輪,右鍵),移動過程中點擊那個鍵,相應位置變會為1
pygame.event.MOUSEBUTTONUP鼠標鍵釋放事件
event.pos 相對於窗口左上角,鼠標的當前坐標值(x,y)
event.button 鼠標釋放鍵編號(整數)左鍵為1,按下滾動輪2、右鍵為3
pygame.event.MOUSEBUTTONDOWN 鼠標鍵按下事件
event.pos 相對於窗口左上角,鼠標的當前坐標值(x,y)
event.button 鼠標按下鍵編號(整數),左鍵為1,按下滾動輪2、右鍵為3,向前滾動滑輪4、向後滾動滑輪5
通過一組簡單的示例對鼠標事件進行演示,示例代碼如下:
程序運行結果如下:
圖2:Pygame鼠標事件——鼠標移動
到此這篇關於Pygame Event事件模塊的詳細示例的文章就介紹到這瞭,更多相關Pygame Event內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- pygame實現鍵盤和鼠標事件的處理
- Pygame實現監聽鼠標示例詳解
- python pygame實現控制物體移動
- Pygame鼠標進行圖片的移動與縮放案例詳解
- 教你利用pygame模塊制作跳躍小球小遊戲