讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 18.2 鍵盤事件 >

18.2 鍵盤事件

下面先來看一個鍵盤事件的例子。假設我們希望一旦按下鍵盤上的某個鍵就做某件事情。在 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_UPK_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_UPK_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-UPK-DOWN。後面還會看到另外一些按鍵名,它們都以 K_ 開頭,後面是按鍵的名字,例如:

  • K_a, K_b(對應字母鍵)

  • K_SPACE

  • K_ESCAPE

等等。