在 這個系列的第一篇文章 中,我解釋瞭如何使用 Python 建立一個簡單的基於文本的骰子游戲。在第二部分中,我向大家展現瞭如何從頭開始構建遊戲,即從 建立遊戲的環境 開始。可是每一個遊戲都須要一名玩家,而且每一個玩家都須要一個可操控的角色,這也就是咱們接下來要在這個系列的第三部分中須要作的。linux
在 Pygame 中,玩家操控的圖標或者化身被稱做妖精sprite。若是你如今尚未任何可用於玩家妖精的圖像,你可使用 Krita 或 Inkscape 來本身建立一些圖像。若是你對本身的藝術細胞缺少自信,你也能夠在 OpenClipArt.org 或 OpenGameArt.org 搜索一些現成的圖像。若是你還未按照上一篇文章所說的單首創建一個 images 文件夾,那麼你須要在你的 Python 項目目錄中建立它。將你想要在遊戲中使用的圖片都放 images 文件夾中。app
爲了使你的遊戲真正的刺激,你應該爲你的英雄使用一張動態的妖精圖片。這意味着你須要繪製更多的素材,而且它們要大不相同。最多見的動畫就是走路循環,經過一系列的圖像讓你的妖精看起來像是在走路。走路循環最快捷粗糙的版本須要四張圖像。優化
注意:這篇文章中的代碼示例同時兼容靜止的和動態的玩家妖精。動畫
將你的玩家妖精命名爲 hero.png。若是你正在建立一個動態的妖精,則須要在名字後面加上一個數字,從 hero1.png 開始。3d
在 Python 中,當你在建立一個你想要顯示在屏幕上的對象時,你須要建立一個類。對象
在你的 Python 腳本靠近頂端的位置,加入以下代碼來建立一個玩家。在如下的代碼示例中,前三行已經在你正在處理的 Python 腳本中:blog
import pygame import sys import os # 如下是新代碼 class Player(pygame.sprite.Sprite): ''' 生成一個玩家 ''' def __init__(self): pygame.sprite.Sprite.__init__(self) self.images = [] img = pygame.image.load(os.path.join('images','hero.png')).convert() self.images.append(img) self.image = self.images[0] self.rect = self.image.get_rect()
若是你的可操控角色擁有一個走路循環,在 images 文件夾中將對應圖片保存爲 hero1.png 到 hero4.png 的獨立文件。遊戲
使用一個循環來告訴 Python 遍歷每一個文件。圖片
''' 對象 ''' class Player(pygame.sprite.Sprite): ''' 生成一個玩家 ''' def __init__(self): pygame.sprite.Sprite.__init__(self) self.images = [] for i in range(1,5): img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert() self.images.append(img) self.image = self.images[0] self.rect = self.image.get_rect()
如今已經建立好了一個 Player 類,你須要使用它在你的遊戲世界中生成一個玩家妖精。若是你不調用 Player 類,那它永遠不會起做用,(遊戲世界中)也就不會有玩家。你能夠經過立馬運行你的遊戲來驗證一下。遊戲會像上一篇文章末尾看到的那樣運行,並獲得明確的結果:一個空蕩蕩的遊戲世界。ip
爲了將一個玩家妖精帶到你的遊戲世界,你必須經過調用 Player 類來生成一個妖精,並將它加入到 Pygame 的妖精組中。在以下的代碼示例中,前三行是已經存在的代碼,你須要在其後添加代碼:
world = pygame.display.set_mode([worldx,worldy]) backdrop = pygame.image.load(os.path.join('images','stage.png')).convert() backdropbox = screen.get_rect() # 如下是新代碼 player = Player() # 生成玩家 player.rect.x = 0 # 移動 x 座標 player.rect.y = 0 # 移動 y 座標 player_list = pygame.sprite.Group() player_list.add(player)
嘗試啓動你的遊戲來看看發生了什麼。高能預警:它不會像你預期的那樣工做,當你啓動你的項目,玩家妖精沒有出現。事實上它生成了,只不過只出現了一毫秒。你要如何修復一個只出現了一毫秒的東西呢?你可能回想起上一篇文章中,你須要在主循環中添加一些東西。爲了使玩家的存在時間超過一毫秒,你須要告訴 Python 在每次循環中都繪製一次。
將你的循環底部的語句更改以下:
world.blit(backdrop, backdropbox) player_list.draw(screen) # 繪製玩家 pygame.display.flip() clock.tick(fps)
如今啓動你的遊戲,你的玩家出現了!
根據你如何建立你的玩家妖精,在它周圍可能會有一個色塊。你所看到的是 alpha 通道應該佔據的空間。它原本是不可見的「顏色」,但 Python 如今還不知道要使它不可見。那麼你所看到的,是圍繞在妖精周圍的邊界區(或現代遊戲術語中的「命中區hit box」)內的空間。
你能夠經過設置一個 alpha 通道和 RGB 值來告訴 Python 使哪一種顏色不可見。若是你不知道你使用 alpha 通道的圖像的 RGB 值,你可使用 Krita 或 Inkscape 打開它,並使用一種獨特的顏色,好比 #00ff00(差很少是「綠屏綠」)來填充圖像周圍的空白區域。記下顏色對應的十六進制值(此處爲 #00ff00,綠屏綠)並將其做爲 alpha 通道用於你的 Python 腳本。
使用 alpha 通道須要在你的妖精生成相關代碼中添加以下兩行。相似第一行的代碼已經存在於你的腳本中,你只須要添加另外兩行:
img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert() img.convert_alpha() # 優化 alpha img.set_colorkey(ALPHA) # 設置 alpha
除非你告訴它,不然 Python 不知道將哪一種顏色做爲 alpha 通道。在你代碼的設置相關區域,添加一些顏色定義。將以下的變量定義添加於你的設置相關區域的任意位置:
ALPHA = (0, 255, 0)
在以上示例代碼中,0,255,0 被咱們使用,它在 RGB 中所表明的值與 #00ff00 在十六進制中所表明的值相同。你能夠經過一個優秀的圖像應用程序,如 GIMP、Krita 或 Inkscape,來獲取全部這些顏色值。或者,你可使用一個優秀的系統級顏色選擇器,如 KColorChooser,來檢測顏色。
若是你的圖像應用程序將你的妖精背景渲染成了其餘的值,你能夠按需調整 ALPHA 變量的值。不論你將 alpha 設爲多少,最後它都將「不可見」。RGB 顏色值是很是嚴格的,所以若是你須要將 alpha 設爲 000,但你又想將 000 用於你圖像中的黑線,你只須要將圖像中線的顏色設爲 111。這樣一來,(圖像中的黑線)就足夠接近黑色,但除了電腦之外沒有人能看出區別。
運行你的遊戲查看結果。
在 這個系列的第四篇文章 中,我會向大家展現如何使你的妖精動起來。多麼的激動人心啊!