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

18.3 鼠標事件

我們剛才看到了如何從鍵盤得到按鍵事件,以及如何使用這些事件來控制程序中的某些方面。前面使用箭頭鍵讓沙灘球向上和向下移動。現在打算使用鼠標來控制球。從中你會瞭解到如何處理鼠標事件以及如何使用鼠標位置信息。

最常用的 3 類鼠標事件如下:

  • MOUSEBUTTONUP

  • MOUSEBUTTONDOWN

  • MOUSEMOTION

最簡單的事情是:只要鼠標在 Pygame 窗口中移動,就讓沙灘球隨著鼠標位置移動。要移動沙灘球,我們將使用球的 rect.center 屬性。這樣一來,球的中心就會跟著鼠標移動。

我們要把 while 循環中檢測按鍵事件的代碼替換為檢測鼠標事件。

這比檢測鍵盤事件還要簡單。對代碼清單 18-2 完成以上修改,並試著運行這個程序。event.pos 部分是鼠標的位置(x 和 y 坐標)。只需要把球的中心移動到這個位置。注意,只要鼠標在移動,球就跟著移動。也就是說,只要 MOUSEMOVE 事件正在發生,球就會隨著移動。改變球的 rect.center 會同時改變 x 和 y 位置。我們不再只是讓球向上或向下移動,而是會上下左右同時移動。如果沒有鼠標事件(可能因為鼠標沒有移動,或者鼠標光標落在 Pygame 窗口之外),球就會繼續在左右兩邊反彈。

現在試著只是在鼠標按鈕保持按下時才讓鼠標控制起作用。鼠標按鈕保持按下時移動鼠標稱為拖動(dragging)。並沒有一種 MOUSEDRAG 事件類型,所以需要使用現有的事件類型來得到我們希望的效果。

如何區分是否在拖動鼠標呢?拖動意味著鼠標移動時鼠標按鈕一直保持按下。我們可以利用 MOUSEBUTTONDOWN 事件得到鼠標按鈕何時按下,另外利用 MOUSEBUTTONUP 事件可以得到按鈕何時鬆開(還原,不再按下)。因此只需跟蹤按鈕的狀態,可以通過建立一個變量來做到,我們將這個變量命名為 held_down。具體做法如下:

拖動條件(鼠標移動時鼠標按鈕保持按下)在以上代碼的最後一個 elif 塊中檢測。前面已經修改過代碼清單 18-2,在這個修改後的代碼中,對 while 循環完成上述修改。運行這個程序,看看它的效果。

嘿,要知道我們從第 1 章就已經開始編程了!不過,因為現在開始使用圖形、動畫精靈和鼠標,所以變得更有意思了。前面說過會談到這些內容。不過你要跟上我的思路,先來學習一些基礎知識。