如果想讓球看起來會在窗口的邊界反彈,就要知道它什麼時候「碰到」窗口邊界,然後讓它朝反方向移動。如果想讓球一直來回移動,就要在窗口左右兩邊都做同樣的處理。
在左邊界,這很容易,因為我們只需要檢查球的位置是不是等於 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_speed
和y_speed
)。這會減少每一個動畫步中球移動的距離,所以運動也會更流暢。還可以增加延遲設置。在代碼清單 16-15 中,延遲是 20。這是以毫秒為單位,也就是千分之一秒。所以每次循環時,程序會等待 0.02 秒。如果增加這個數值,運動會變慢。如果減少這個數值,運動就會加速。
可以試著改變速度和延遲來看最後的效果。