下面先來看一個鍵盤事件的例子。假設我們希望一旦按下鍵盤上的某個鍵就做某件事情。在 Pygame 中,這個事件是 KEYDOWN
。為了說明這個事件如何使用,下面還是用代碼清單 16-15 中反彈球的例子,球會向兩邊移動,並在窗口邊界反彈。不過在增加事件之前,下面先更新這個程序,加入我們剛學到的一些新內容:
使用動畫精靈;
使用
clock.tick
而不是time.delay
。
首先,需要為球建立一個類。這個類要有一個 __init__
方法和一個 move
方法。我們將創建這個類的實例,另外在主 while
循環中將使用 clock.tick(30)
。代碼清單 18-1 顯示了修改後的代碼。
代碼清單 18-1 反彈球程序,加入動畫精靈和
Clock.tick
這裡要注意一個問題,移動球時我們沒有「擦除」球,而是做了不同的處理。我們已經知道,在新位置上重畫球之前要從原位置「擦除」動畫精靈有兩種方法:一種方法是在每個動畫精靈的原位置上塗上背景顏色,另一種方法是直接重繪每一幀的整個背景——實際上每一次都會從一個空屏幕開始。在這裡,我們採用了第二種做法。不過這裡不是每次循環時使用 screen.fill
,而是建立了一個名為 background
的表面,用白色填充。每次循環時,只需把這個背景「塊移」到顯示表面 screen
。這樣也能達到目的;這只是完成這項工作的不同方法而已。
按鍵事件
現在我們要增加一個事件處理器,當按下向上箭頭時讓球上移,按下向下箭頭時讓球下移。Pygame 包括多個不同模塊。這一章中我們將使用的模塊是 pygame.event
。
我們已經保證 Pygame 事件循環會一直運行(while
循環)。這個循環在掃瞄一個名為 QUIT
的特殊事件。
while running: for event in pygame.event.get:if event.type == pygame.QUIT: running = False
pygame.event.get
方法從事件隊列得到所有事件的一個列表。for
循環迭代處理這個列表中的每一個事件,如果看到一個 QUIT
事件,它會將 running
設置為 False
,這會導致 while
循環結束,並結束程序。瞭解到這一點後,現在你應該已經完全清楚「點擊 × 結束程序」代碼是如何工作的。
不過對於這個例子,我們還希望檢測另外一種不同類型的事件。我們希望知道何時按下一個按鍵,所以要查找 KEYDOWN
事件。我們需要這樣的代碼:
if event.type == pygame.KEYDOWN
由於前面已經有了一個 if
語句,可以直接用 elif
增加另一個條件(我們已經在第 7 章介紹過這個內容):
按下按鍵時我們想做什麼呢?我們說過,如果按下向上箭頭,要讓球上移,如果按下向下箭頭,要讓球下移。所以可以這樣做:
K_UP
和 K_DOWN
是 Pygame 中向上和向下箭頭的名字。對代碼清單 18-1 完成以上修改,程序現在如代碼清單 18-2 所示。
代碼清單 18-2 響應向上和向下箭頭鍵的反彈球
運行代碼清單 18-2 中的程序,試著按下向上箭頭和向下箭頭。起作用嗎?
重複按鍵
你可能已經注意到,如果保持按下向上或向下箭頭不放,球只會向上或向下移動一步。這是因為,我們沒有告訴程序如果按鍵一直按下時該怎麼做。用戶按鍵時,會生成一個 KEYDOWN
事件,不過 Pygame 中還有一個設置,可以在按鍵一直按下時生成多個 KEYDOWN
事件。這稱為按鍵重複(key repeat)。你要告訴它開始重複之前等待多長時間,另外還要指出多長時間重複一次。這些值的單位都是毫秒(千分之一秒)。可能像這樣:
delay = 100interval = 50pygame.key.set_repeat(delay, interval)
delay
值告訴 Pygame 在開始重複之前等待多長時間,interval
值告訴 Pygame 按鍵要以多快的速度重複,也就是說,各個 KEYDOWN
事件之間要間隔多長時間。
試著把這個代碼增加到代碼清單 18-2(放在 pygame.init
後面,不過要在 while
循環前面),看看這會讓程序的行為有什麼變化。
事件名和按鍵名
查找按下的向上或向下箭頭時,我們要尋找 KEYDOWN
事件類型以及 K_UP
和 K_DOWN
按鍵名。還有其他事件嗎?其他按鍵名是什麼?
實際上還有相當多的事件,所以這裡不打算一一列出。不過 Pygame 網站上提供了所有事件的列表。可以在 Pygame 文檔的 event 部分找到這個事件列表:
www.pygame.org/docs/ref/event.html
按鍵名列表放在 key 部分:
www.pygame.org/docs/ref/key.html
以下是我們將要使用的一些常用事件:
QUIT
KEYDOWN
KEYUP
MOUSEMOTION
MOUSEBUTTONUP
MOUSEBUTTONDOWN
Pygame 還給每個可以按下的鍵命了名。我們剛才看到了向上和向下箭頭,它們的名字分別是 K-UP
和 K-DOWN
。後面還會看到另外一些按鍵名,它們都以 K_
開頭,後面是按鍵的名字,例如:
K_a, K_b
(對應字母鍵)K_SPACE
K_ESCAPE
等等。