讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 18.4 定時器事件 >

18.4 定時器事件

在這一章中,目前為止我們已經見過鍵盤事件和鼠標事件。另一種非常有用的事件(特別是在遊戲和仿真中)是定時器事件(timer event)。定時器會按固定的間隔生成事件,就像你的鬧鐘一樣。如果你設好鬧鐘,並把鬧鈴打開,每天它都會在固定的時刻響起來。

可以把 Pygame 定時器設置為任意間隔。如果定時器到時間,它會創建一個能夠被事件循環檢測到的事件。那麼它會生成什麼類型的事件呢?它生成的是一種用戶事件(user event)。

Pygame 有很多預定義的事件類型。這些事件會編號(從 0 開始),它們還有自己的名字以便我們記住。我們已經見過一些事件名,比如 MOUSEBUTTONDOWNKEYDOWN。除此以外,Pygame 還為用戶定義的事件(user-defined event)留出了很大空間。這些事件不是 Pygame 為特定事件預留的,你可以用它們表示任何事情,其中之一就是定時器。

要在 Pygame 中設置定時器,要使用 set_timer 函數,如下:

pygame.time.set_timer(EVENT_NUMBER, interval)  

EVENT_NUMBER 是事件編號,interval 是定時器多長時間(單位是毫秒)到期並生成一個事件。

要使用什麼 EVENT_NUMBER 呢?應當使用 Pygame 還沒有用過的一個編號(也就是說,尚未將這個編號用於其他事件)。可以詢問 Pygame 哪些編號已經佔用。可以在交互模式中執行下面的命令:

>>> import pygame>>> pygame.USEREVENT24  

這會告訴我們,Pygame 正在使用從 0 到 23 的事件編號,對於用戶事件,第一個可用的編號是 24。所以需要選擇 24 或一個更大的數。可以大到什麼程度呢?可以再來問一問 Pygame。

>>> pygame.NUMEVENTS32  

NUMEVENTS 告訴我們 Pygame 中可以有的事件類型最大編號是 32(從 0 到 31)。所以必須選擇一個大於或等於 24 但小於 32 的數。可以像這樣直接設置定時器:

pygame.time.set_timer(24, 1000)  

不過,如果出於某種原因 USEREVENT 的值有變化,這個代碼可能就無法正常工作了。可能這樣做會更好一些:

pygame.time.set_timer(pygame.USEREVENT, 1000)  

如果我們必須建立另一個用戶事件,可以使用 USEREVENT + 1,依此類推。這個例子中的 1000 表示 1000 毫秒,也就是 1 秒,所以這個定時器每秒響一次。下面把這個定時器放入我們反彈球程序中。

像前面一樣,我們將利用事件讓球上移或下移,不過由於這一次球並非由用戶來控制,我們要讓它除了在左右兩邊反彈還會在上下邊反彈。在修改代碼清單 18-2 的基礎上,完整的程序見代碼清單 18-3。

代碼清單 18-3 使用一個定時器事件讓球上移和下移

記住,\ 是行聯接符 。可以用它把正常情況下應該寫在一行上的內容分為兩行來寫。(不過不要在 \ 後面加任何空格,否則行聯接符將不起作用。)

保存並運行代碼清單 18-3 中的程序,應該能看到球來回移動(從一邊到另一邊),另外還會向上或向下移動 30 個像素(每秒移動一次)。向上或向下移動就來自定時器事件。