二、顯示飛船到螢幕上
三、小結
我們現在有了一塊 pygame 遊戲螢幕,現在要往螢幕上加元素,比如我們將要操控的飛船。
首先我們要在螢幕上顯示飛船,顯示的飛船影象是由一張來提供的。因此,我們需要先找到一張合適的來代表飛船。
在《python程式設計:從入門到精通》這本書中對於適合作為素材的做了大致的描述。
首先,最好是背景色為透明的素材,這樣我們可以通過ps等軟體來填充背景色。
其次,也可以是底色和我們的螢幕背景色相同的素材。
而且,最好是 bmp 格式的,因為這是 pygame.image 模組 一定可以支援的格式,其他格式不一樣保證可以支援。
這裡我使用的是書中提供的素材。我們儲存時,將素材放到專案目錄下的 images 檔案中,取名為 ship.bmp。
飛船類的**將會很多,因此肯定不能將其放在主模組中,應該單獨建立乙個模組 ship.py ,用以存放飛船類。
那麼我們該怎麼實現飛船一出來就在指定的位置,這樣的效果呢?
我們可以這樣來實現:
1、在飛船類初始化(例項化)時,就設定好了飛船的位置
2、在飛船類中定義乙個方法,使其能將自己顯示到螢幕上
而這兩個步驟的實現,我們分別放在 飛船類的建構函式中 和 飛船類的例項方法中 去實現
基於上一點的考慮,我們將在飛船類的__init__方法中實現將飛船的位置設定為我們指定的位置。
乙個 su***ce 型別的物件,它的座標有這麼6個值:
1、centerx 物件中心點的 x 座標
2、centery 物件中心點的 y 座標
3、top 物件頂邊座標
4、bottom 物件底邊座標
5、left 物件左邊座標
6、right 物件右邊座標
而如果我們想將飛船設定在螢幕**且緊貼底邊的話,可以這樣實現:
垂直方向上,可以設定 centerx 的值,使其與螢幕的 centerx 值相等。
水平方向上,可以設定 bottom 的值,使其與螢幕的 bottom 值相等。
根據上面的分析,我們編寫飛船類以及其建構函式:
import pygame
class ship(object):
# 初始化飛船,飛船剛出現時,是位於螢幕的中間靠最底邊的位置
def __init__(self, screen): # 這裡需要傳入螢幕,是因為我們設定飛船的座標需要用到螢幕的座標
# 飛船將來要在哪個螢幕上進行顯示
self.screen = screen
# 載入飛船顯示時的資源
self.image = pygame.image.load('images/ship.bmp')
# 獲取飛船的座標變數,以便我們之後設定它們
self.rect = self.image.get_rect()
# 獲取螢幕的座標,以便我們之後使用它們
self.screen_rect = screen.get_rect()
# 設定飛船初始化時的位置,
# 通過螢幕的座標和尺寸來控制飛船處在螢幕中間靠底的位置
# 飛船的橫座標 與 螢幕的橫座標相同
self.rect.centerx = self.screen_rect.centerx
# 飛船的底邊 與 螢幕的底邊相同
self.rect.bottom = self.screen_rect.bottom
至此,我們已經實現了在飛船物件初始化之際,就將其設定在我們期望的位置上。
那麼,接下來就需要將飛船物件繪製到我們的螢幕上。
這裡,我們在飛船類中定義乙個例項方法,作用是將飛船繪製到目標座標上。
def blitme(self):
"""將飛船顯示到螢幕上的方法
"""# su***ce 物件的方法 blit() ,可以將乙個su***ce物件覆蓋到另乙個su***ce物件上
# 注意是將引數中的物件覆蓋到原物件上
self.screen.blit(self.image, self.rect)
至此,我們有了乙個完整的飛船類,可以在初始化之際在螢幕的指定位置顯示。
現在,我們就嘗試在主模組**中做修改,例項化飛船類,並將其顯示到螢幕上。
由於我們是在 ship 模組中定義的飛船類,因此在主模組中需要從 ship 模組中手動匯入飛船類
# 從ship模組中匯入飛船類,用以建立飛船
from ship import ship
基於我們定義的飛船類來建立乙個飛船物件,也就是我們將來要操作的飛船
# 初始化飛船物件,建立一架飛船
my_ship = ship(screen)
有了飛船物件以後,我們就可以呼叫定義的繪製飛船的方法,將飛船在指定位置繪製。
這裡有兩個詞需要注意區別:
1、繪製。是將指定的物件繪製到指定的位置,但是如果只繪製的話,我們是看不到的。
2、顯示。將此時螢幕上繪製的東西全都顯示出來。
因此,我們需要先繪製飛船到螢幕上,再顯示螢幕,這樣才可以看到應有的內容。
還需要注意的是,我們在螢幕上繪製了兩樣東西——背景 和 飛船,後繪製的物件會覆蓋在先繪製的物件之上,因此要將繪製飛船的**放在繪製背景的**後面,並且在需要繪製的物件都繪製完以後,再重新整理螢幕。
# 為純黑的遊戲螢幕填充上不一樣的顏色
screen.fill(my_setting.background_color)
# 在背景之上繪製我們的飛船,注意這裡的邏輯,必須是飛船在背景之後繪製,確保飛船在背景的上層
my_ship.blitme()
# 重新整理螢幕,使得元素能夠不斷重新整理位置
pygame.display.flip()
實現的效果:
至此,我們達到了**的預期效果。
這一部分,學習了如何通過座標來設定 su***ce 物件的位置,以及具體怎麼在**中實現,以及 pygame 繪製多個物件的方法。還是那句話,最好的學習方法就是輸出。
Pygame 外星人入侵(7)外星人壓境
二 更加合理地移動 三 小結 在之前的博文中,實現了在螢幕上繪製一大群外星人,現在我們想讓這群外星人動起來,它們的移動遵循著一定的規律。我們首先要實現的是,如何讓一群外星人一起向螢幕右側移動。遊戲引數性質的變數統一存放在 設定模組中的設定類中 6 外星人的屬性 6。1 外星人移動的速度 self.a...
python實踐 pygame外星人入侵
python學習練手遊戲 規劃專案 安裝pygame 飛船與外星人的建立 外星人與飛船的戰爭 新增記分牌 1 規劃專案 在外星人入侵中,我們要實現的功能有 飛船可以左右移動,並用空格鍵射擊 外星人群從左移動到螢幕右端然後下移一定距離,接著往反方向移動 飛船射殺外星人,也就是子彈與外星人碰撞時,子彈與...
外星人入侵
今天是乙個週末,宿舍的人全部都出去玩了,而我因為太懶乙個人留在了宿舍,連床都不起,吃飯靠的是點外賣。不過,為了好玩,我跟著書本學習打了乙個2d小遊戲,並加入了一點自己的東西。一 遊戲頁面 剛開始我把所有的遊戲螢幕設定都放在了下面 裡,這使得 看起來非常長,和雜亂,所以為了使遊戲方便擴充套件和整個 邏...