讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 16.9 讓球反彈 >

16.9 讓球反彈

如果想讓球看起來會在窗口的邊界反彈,就要知道它什麼時候「碰到」窗口邊界,然後讓它朝反方向移動。如果想讓球一直來回移動,就要在窗口左右兩邊都做同樣的處理。

在左邊界,這很容易,因為我們只需要檢查球的位置是不是等於 0(或者某個很小的數)。

在右邊界,就要查看球的右邊界是不是在窗口的右邊界上。不過,球的位置是按它的左邊界(左上角)而不是右邊界設置的。所以必須減去球的寬度:

球向窗口右邊移動時,位置達到 550 時要將它反彈(讓它朝反方向移動)。

為了讓事情變得簡單一些,我們要對代碼做一些修改。

  • 我們希望球永遠來回反彈(或者直到我們關閉 Pygame 窗口)。因為已經有了一個 while 循環,只要窗口打開,這個 while 循環就一直運行,所以我們要把顯示球的代碼移到這個循環內部(這就是程序最後一部分中的 while 循環)。

  • 並不總是將球的位置增加 5,我們會建立一個新變量 speed,用來確定每次迭代時以多快的速度移動球。我還打算把這個值設置為 10,讓球稍稍加快速度。

新代碼見代碼清單 16-14。

代碼清單 16-14 讓沙灘球反彈

讓球在窗口兩邊反彈的關鍵是第 19 行和第 20 行。通過第 19 行的代碼(if x> screen.get_width-90orx<0:),檢查球是否在窗口邊界上,如果是,就在第 20 行讓它的方向反轉(x_speed=-x_speed)。

試試看效果怎麼樣。

在 2D 空間中反彈

到目前為止,我們只是讓球來回移動,或者說這只是一個方向上的運動。現在,讓它同時還會上下移動。為達到這個目的,只需要再做一些修改,如代碼清單 16-15 所示。

代碼清單 16-15 在 2D 空間中讓沙灘球反彈

我們在前面的程序中增加了第 9 行(y_speed=10)、第 18 行(y=y+y_speed)、第 21 行(ify> screen.get_height-90ory<0:) 和 第 22 行(y_speed=-y_speed)。現在試試看效果怎麼樣!

如果想讓球慢下來,有幾種方法可以做到。

  • 可以減少速度變量(x_speedy_speed)。這會減少每一個動畫步中球移動的距離,所以運動也會更流暢。

  • 還可以增加延遲設置。在代碼清單 16-15 中,延遲是 20。這是以毫秒為單位,也就是千分之一秒。所以每次循環時,程序會等待 0.02 秒。如果增加這個數值,運動會變慢。如果減少這個數值,運動就會加速。

可以試著改變速度和延遲來看最後的效果。