讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 25.1 滑雪者 >

25.1 滑雪者

首先,我們來編寫遊戲中的滑雪者。當你運行 Skier 程序的時候,應該注意到了滑雪者本身只能在屏幕上左右來回移動,而不能上下移動。滑雪者滑「下」小山的錯覺則是通過將場景(樹和小旗)向上滾動來實現的。

在滑雪者滑下小山的場景實現中,需要 5 張不同的圖片:一張滑雪者一直向下滑,兩張滑雪者向左轉(一張稍向左轉,一張大幅度左轉),兩張滑雪者向右轉(一張稍向右轉,一張大幅度右轉)。在程序的開頭,我們為這些圖片創建了一個列表,然後將圖片按特定的順序放入列表。

skier_images = [ \"skier_down.png\", \"skier_right1.png\",\"skier_right2.png\", \"skier_left2.png\",\"skier_left1.png\"]  

很快你就會知道為什麼要按這樣的順序排放。

我們使用變量 angle 來標記滑雪者當前面對的方向,它的值從 -2 到 +2,分別如下:

  • -2 = 向左急轉

  • -1 = 稍向左轉

  • 0 = 一直向下

  • +1 = 稍向右轉

  • +2 = 向右急轉

(注意,這裡的「左」和「右」是相對屏幕的方向,即我們看到的方向,而不是滑雪者的左和右。)

我們使用 angle 的值來確定要使用哪張圖片。事實上,我們可以直接使用 angle 的值作為列表的索引來指定圖片:

  • skier_images[0] 是滑雪者向下滑的圖片。

  • skier_images[1] 是滑雪者稍向右轉的圖片。

  • skier_images[2] 是滑雪者向右急轉的圖片。

接下來是微妙之處。還記得我們在第 12 章談到過列表嗎?我們說過負索引值會從列表的尾部開始往前數。所以,在這個例子中

  • skier_images[-1] 是滑雪者稍向左轉的圖片(通常會使用 skier_images[4])。

  • skier_images[-2] 是滑雪者向左急轉的圖片(通常會使用 skier_images[3])。

現在你知道為什麼我們將列表中的圖片按這種特定的順序排列了:

  • angle = +2(向右急轉)= skier_images[2]

  • angle = +1(稍向右轉)= skier_images[1]

  • angle = 0(向下滑)= skier_images[0]

  • angle = -1(稍向左轉)= skier_images[-1](也就是 skier_images[4]

  • angle = -2(向左急轉)= skier_images[-2](也就是 skier_images[3]

我們為滑雪者創建一個 Pygame Sprite 類的子類。滑雪者與窗口上邊界的距離始終為 100 像素,開始時他位於窗口中心,也就是距離窗口左邊界 320 像素,即 x=320,因為窗口的寬度是 640 像素。因此滑雪者的初始位置是 [320, 100]。滑雪者類定義的第一部分是下面這樣:

class SkierClass(pygame.sprite.Sprite):    def __init__(self):pygame.sprite.Sprite.__init__(self)self.image =   pygame.image.load(\"skier_down.png\")self.rect = self.image.get_rectself.rect.center = [320, 100]self.angle = 0  

我們用一個類來改變滑雪者的狀態,它會在 angle 的值改變時載入正確的圖片,並設置好滑雪者的速度。速度由 x 和 y 兩個值構成。我們只改變左右方向的速度(x 方向的速度,x-speed),但是 y 方向的速度(y-speed)決定了場景向上滾動的速度(滑雪者向「下」滑的速度)。當他垂直向下運動時,y 方向的速度比較快,而當他轉向時,y 方向的速度則比較慢。速度的計算公式如下:

speed = [self.angle, 6 - abs(self.angle) * 2]  

此行代碼中的 abs 用於取得 angle 的絕對值,也就是說我們忽略符號(+ 和 -)後的值。對於 y 方向的速度來說,滑雪者左轉還是右轉都沒有影響,只要知道轉的程度就行了。

用於轉彎的全部代碼如下:

def turn(self, direction):self.angle = self.angle + directionif self.angle < -2:  self.angle = -2if self.angle >  2:  self.angle =  2center = self.rect.centerself.image = pygame.image.load(skier_images[self.angle])self.rect = self.image.get_rectself.rect.center = centerspeed = [self.angle, 6 - abs(self.angle) * 2]return speed  

我們還需要一個方法來控制滑雪者左右來回移動,以保證他不會滑出窗口邊緣:

def move(self, speed):self.rect.centerx = self.rect.centerx + speed[0]if self.rect.centerx < 20:  self.rect.centerx = 20if self.rect.centerx > 620: self.rect.centerx = 620 

我們使用方向鍵來控制滑雪者左右運動,所以要添加 Pygame 初始化和事件循環的代碼,這樣就可以讓只有滑雪者的程序運行起來。代碼如下所示。

代碼清單 25-1 創建 Skier 遊戲——只有滑雪者

如果運行以上代碼,你只會在界面中看到滑雪者(沒有分數,沒有障礙物),你可以讓他向左右轉彎。