<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
事件(Event)是 Pygame 的重要模組之一,它是構建整個遊戲程式的核心,比如常用的滑鼠點選、鍵盤敲擊、遊戲視窗移動、調整視窗大小、觸發特定的情節、退出遊戲等,這些都可以看做是“事件”。
Pygame 定義了一個專門用來處理事件的結構,即事件佇列,該結構遵循遵循佇列“先到先處理”的基本原則,通過事件佇列,我們可以有序的、逐一的處理使用者的操作(觸發事件)。下述表格列出了 Pygame 中常用的遊戲事件:
名稱 | 說明 |
---|---|
QUIT | 使用者按下視窗的關閉按鈕 |
ATIVEEVENT | Pygame被啟用或者隱藏 |
KEYDOWN | 鍵盤按下 |
KEYUP | 鍵盤放開 |
MOUSEMOTION | 滑鼠移動 |
MOUSEBUTTONDOWN | 滑鼠按下 |
MOUSEBUTTONUP | 滑鼠放開 |
JOYAXISMOTION | 遊戲手柄(Joystick or pad) 移動 |
JOYBALLMOTION | 遊戲球(Joy ball) 移動 |
JOYHATMOTION | 遊戲手柄(Joystick) 移動 |
JOYBUTTONDOWN | 遊戲手柄按下 |
JOYBUTTONUP | 遊戲手柄放開 |
VIDEORESIZE | Pygame視窗縮放 |
VIDEOEXPOSE | Pygame視窗部分公開(expose) |
USEREVENT | 觸發一個使用者事件 |
注意,當使用 Pygame 做遊戲開發時,上述事件並非都會應用的到,因此在學習的過程中,我們要懂得觸類旁通、舉一反三。
名稱 | 說明 |
---|---|
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 語句。如下所示:
import pygame 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("./python.png") # 獲取影象的位置 position = img.get_rect() # 建立一個主視窗 screen = pygame.display.set_mode(size) # 標題 pygame.display.set_caption("Python自學網") # 建立遊戲主迴圈 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()
Pygame 提供了三個滑鼠事件,分別是滑鼠移動(MOUSEMOTION)、滑鼠按下(MOUSEBUTTONDOWN)、滑鼠釋放(MOUSEBUTTONUP),不同事件型別對應著不同的成員屬性。如下所示:
pygame.event.MOUSEMOTION滑鼠移動事件
event.pos 相對於視窗左上角,滑鼠的當前座標值(x,y)
event.rel 滑鼠相對運動距離(X,Y),相對於上次事件
event.buttons 滑鼠按鈕初始狀態(0,0,0),分別對應(左鍵,滑輪,右鍵),移動過程中點選那個鍵,相應位置變會為1pygame.event.MOUSEBUTTONUP滑鼠鍵釋放事件
event.pos 相對於視窗左上角,滑鼠的當前座標值(x,y)
event.button 滑鼠釋放鍵編號(整數)左鍵為1,按下捲動輪2、右鍵為3pygame.event.MOUSEBUTTONDOWN 滑鼠鍵按下事件
event.pos 相對於視窗左上角,滑鼠的當前座標值(x,y)
event.button 滑鼠按下鍵編號(整數),左鍵為1,按下捲動輪2、右鍵為3,向前捲動滑輪4、向後捲動滑輪5
import pygame from random import randint # 初始化程式 pygame.init() screen = pygame.display.set_mode((450, 400)) pygame.display.set_caption("Python自學網") # 更新顯示 pygame.display.flip() while True: # 等待事件發生 event = pygame.event.wait() if event.type == pygame.QUIT: exit("成功退出") if event.type == pygame.MOUSEBUTTONDOWN: # pos 獲取滑鼠當前位置 print('滑鼠按下', event.pos) mx, my = event.pos # 呼叫 pygame.draw 模組畫圓 pygame.draw.circle(screen, (255, 255, 0), (mx, my), 50) # 處理完,更新顯示 pygame.display.update() if event.type == pygame.MOUSEBUTTONUP: print('滑鼠彈起') pass if event.type == pygame.MOUSEMOTION: print('滑鼠移動') mx, my = event.pos # 隨機生成 RGB 顏色值 r = randint(0, 255) g = randint(0, 255) b = randint(0, 255) pygame.draw.circle(screen, (r, g, b,), (mx, my), 50) # 處理完,更新顯示 pygame.display.update()
到此這篇關於Python之Pygame的Event事件模組的文章就介紹到這了,更多相關Pygame Event事件模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45