1. 繪制影像的三個步驟

介紹一下怎么樣把影像檔案中保存的影像資料, 繪制到游戲的螢屏上,先明確一下什么是影像檔案以及要使用影像檔案,第1步應該做什么, 在之前準備專案的時候,在專案中添加了一個images 目錄,

在這個目錄下保存有大量的影像檔案,

這些影像檔案默認情況下是保存在磁盤上的.
在開發時,如果想要使用這些影像檔案中保存的資料,第1步應該把影像檔案中保存的資料加載到記憶體,譬如現在做一個雙擊的動作,雙擊之后可以在螢屏右側看到影像的內容,

之所以能夠看到影像的內容,是因為雙擊的動作,會把影像檔案中保存的資料加載到記憶體, 加載之后,才能夠看到影像的內容.
剛剛確認了一下影像檔案,默認情況下都是保存在磁盤上的,
在開發中如果想要使用影像檔案中保存的資料,第1步就應該把影像檔案中保存的資料加載到記憶體,這個概念明確之后,接下來看一下在使用pygame開發的時候,怎么樣把影像檔案中保存的資料繪制到游戲的視窗中.
要想實作這個目標啊,只需要撰寫三句代碼,

第1句代碼,讓pygame的image 模塊來呼叫一下load()方法, load()有加載的意思,傳入一個要加載的影像檔案路徑,

這個方法就會回傳一個加載之后的影像資料.load()方法,負責加載影像的資料.
那加載之后呢,第2步就使用 游戲螢屏 物件呼叫一個blit 方法,
blit 方法需要傳入兩個引數,第一個引數就是剛剛加載得到的影像資料, 第2個引數呢,可以是一個元組,也可以是一個矩形物件,

總而言之,第2個引數就是指定在游戲螢屏的什么位置來繪制這個影像,第三步, 繪制之后還不夠,如果希望在螢屏上看到最終的繪制結果,還需要呼叫一個非常重要的方法,需要呼叫一下pygame.display 這個模塊提供的一個update方法,

update有更新的意思,只有更新了整個螢屏,才能夠在螢屏上看到最終的繪制結果,這樣就是使用pygame來繪制一張影像的三個步驟,

那接下來就針對三個步驟來做一個簡單的演練,在這個演練中就加載一下背景影像,加載之后把背景圖片繪制在(0, 0) 的位置,也就是游戲視窗的左上角,繪制完成呼叫一下update() 方法來看到最終的顯示結果.
演練目標明確之后,粘貼之后, 就把游標放在第8行,

要繪制影像,應該在無限回圈的上方來繪制,先撰寫一下注釋,目標明確之后,以注釋的方式來明確一下繪制背景影像的三個步驟,

現在123, 3個步驟寫完,就先來使用image 模塊的load 方法加載一下影像.
要想使用pygame的image模塊,選中load 方法,然后在方法的小括號內部傳入要加載的影像名稱,先敲一個點表示當前目錄,

圖片加載完成.
同時注意load 方法是有回傳結果的, 所以在前面定義一個變數來接收一下,

影像資料加載完成,可以讓螢屏物件bg 來呼叫blit 方法,就讓screen這個物件呼叫blit 的方法,把剛剛加載的背景影像傳遞進來,

然后呢,跟一個逗號, 在逗號后面跟上一個元組,這個元組呢就指定一下在游戲視窗的什么位置來繪制這個背景影像.(0, 0) 是在螢屏的左上角來繪制背景圖,現在繪制的動作也做完.

update 方法是display模塊提供的,那現在就用pygame點找到display,直接敲一個update,好1 23, 三個步驟寫完, 來運行一下程式,

現在螢屏上已經可以看到背景圖片,

現在把繪制背景影像的位置改一下,x值寫一個100,y值同樣也寫一個100,

現在再運行一下,

再演示一下,最后一句代碼.如果讓螢屏執行完繪制動作之后,不呼叫update方法就沒有辦法在螢屏上看到最終的繪制結果.
現在就把update的方法注釋一下,再來運行一下程式,

游戲啟動了,這個黑黑的視窗上并沒有任何的內容.這樣就是不呼叫update方法看到的一個結果.
把這個方法的注釋打開,重新運行一下程式.
然后選擇停止所有.

選擇停止之后,

重新運行一下程式, 程式啟動了, 并且可以看到背景圖片的繪制,

2. 繪制英雄和透明影像
接下來再針對繪制的影像在做一個案例演練,來把英雄的影像畫在螢屏上,通過這個案例演練,首先要強化一下上一小節學習的加載影像以及繪制影像的代碼,并且介紹一下什么叫做透明影像.

明確了演練目標之后,來看一下演練步驟,在這一小節,首先從me1.png 這個影像檔案來加載一下飛機的資料,當把飛機的資料加載完成之后,就把英雄的飛機掛在螢屏的水平方向,200的位置,垂直方向500的位置.

當讓screen物件呼叫了blit 方法,

完成了繪制之后,還需要調一下display模塊提供的update的方法,

只有呼叫了update 方法,才能夠在螢屏上看到最侄訓制的結果, 也就是英雄的飛機.
做一下演練,首先來找到image的檔案夾,

來看看在這一小節要繪制的英雄圖片,

找到并雙擊,

這些小格子就是圖片的透明區域,至于透明區域會看到什么效果,等下撰寫完代碼,就可以一目了然了.
再找到我們上一小節完成的代碼, CTRL a選中, CTRL c復制,然后切換到一個全新的空白檔案CTRL v粘貼進來.

把游標放在第16行, 注意要想繪制飛機的圖片,就應該在無限回圈的上方來撰寫代碼.
先增加一個單行注釋, 來明確一下這一小節要繪制的目標英雄的飛機,目標明確之后,要想在螢屏上繪制一個影像,第1步應該加載影像,

那現在先給英雄起個名字hero,然后呢使用pygame 模塊來呼叫load 方法,load 方法的引數就是要加載影像檔案的完整路徑,

那現在寫一個點, 表示當前路徑,

然后呢跟上images表示影像目錄下的,

然后呢再跟上me1.png 這個影像檔案名,

影像資料加載完成,接下來讓screen 這個物件來呼叫blit 方法,

blit 方法可以接收兩引數,第1個引數就是剛剛加載的影像資料,就把hero傳遞過來,

第2個引數是一個元組,這個元組的第1個數值是水平方向的坐標,元組的第2個數值是垂直方向的坐標,現在指定一個200和500,

讓螢屏物件執行了blit 方法之后, 還需要呼叫一下display這個模塊提供的update方法.
調一下update方法,

好三句代碼寫完, 先來運行一下程式,看看英雄的飛機能不能出現在螢屏上.
英雄的飛機已經出現在螢屏上,

下方是一個背景圖片,上方有一個英雄的小飛機.
現在英雄的飛機已經出現了,如果希望英雄出現的位置向左偏一點,應該修改第1個數值,第1個數值表示水平方向的x值.
那現在就把程式停止一下,


然后把水平的200修改成150,現在再運行一下程式, 英雄的小飛機位置發生變化了,

觀察一下英雄飛機下方有一個隕石,但是隕石并沒有被小飛機全部遮擋住,有一半的隕石能夠透露出來, 這個就是透明圖片的效果.
再看一下要加載的影像,在影像上有一些灰色的小格子,這些灰色的小格子就是透明區域,

在顯示影像時,如果下方有其他的影像內容,這些透明的小格子, 就會把其他的影像內容通過小格子透露出來, 同樣也可以讓我們肉眼看到.這個就是透明影像的概念.
所謂透明影像,就是png 這種格式是支持透明的,在顯示的時候,如果下方已經有內容就會透過透明區域顯示出來,這樣呢就可以看到兩張圖片完全融合的效果.
譬如小飛機疊在隕石上,這個就是透明圖片的效果.

3.update 方法的作用
介紹一下display模塊提供的update方法的作用,要想繪制影像, 就讓screen 物件來調一下blit 方法.

要想看到繪制的結果,就呼叫一下display模塊提供的update的方法.
一個繪制影像,一個更新顯示,那現在試想一下,假設開發的游戲,需要繪制非常非常多的影像.
那么在撰寫代碼的時候,如果每繪制一張影像就呼叫一次update 方法,每繪制一張影像就更新一下顯示,如果這樣撰寫代碼就顯得太繁瑣了.
有更簡單的方法.
其實在開發時可以讓screen 物件完成了所有blit 方法之后,即完成所有繪制方法之后,再最后統一調一次update的方法,同樣可以在螢屏上看到最終的繪制結果.

驗證一下,先把繪制背景的注釋洗掉一下,這樣呢可以讓代碼看起來更加直觀一些,

大家看在第3行初始化了一下pygame,

第6行呼叫set_mode方法,創建了一個游戲的螢屏,

然后呢,連續的三句代碼是非常類似的,

先來加載影像,
![]()
然后繪制影像,
![]()
緊接著更新顯示,

更新顯示可以在螢屏物件完成所有繪制動作之后統一呼叫.
增加一個注釋, 可以在所有繪制作業完成之后統一呼叫update方法,

update 方法會把screen 物件中最終的繪制結果統一輸出到螢屏上來.
既然如此,第11行這個更新顯示的代碼就可以注釋掉了.
把第11行代碼注釋一下, 來運行一下程式,

看看背景影像和英雄的飛機能不能被最終的顯示在螢屏上來,現在運行一下程式,背景圖片也好,英雄的飛機也好,都能夠顯示在螢屏上,

這個就是在開發時,可以先讓screen 物件順序呼叫blit 方法,按照程式的需求,在不同的位置繪制不同的影像,當所有繪制作業完成之后,最后統一調一次update的方法.

這種方式撰寫代碼, 就不用在每次繪制完影像都呼叫一次更新.
只需要在最后統一調一次update的方法就可以.
為什么update 方法只需要用一次就可以了呢?之前介紹set_mode方法的時候,提到過,暫時可以把screen 物件理解成游戲的螢屏,其實啊,screen 物件本質上是一個記憶體中的螢屏的資料物件,

它只是一個資料物件,可以把screen 物件理解成一個油畫的畫布,畫一個示意圖,現在這個紅色的框框,就是screen 這個物件,

可以在screen 物件上呼叫blit 方法,就可以完成影像的繪制作業.
先來畫一個英雄的飛機,

畫完英雄的飛機之后,如果還希望畫一個敵人的飛機,那么就可以使用blit 方法, 再畫一個敵人的飛機,

如果游戲中的影像比較多,非常有可能出現幾張影像之間彼此覆寫彼此重疊的情況,

但是不管有多少張影像,彼此覆寫和重疊,最終看到的結果只是一個而已.
讓screen 物件呼叫blit 方法,可以在記憶體中進行虛擬的繪制,把需要展現的所有影像全部繪制完成,緊接著呢,就調一下update方法, update 方法會把screen 物件中繪制的最終結果,一次性的繪制到游戲螢屏上.
screen 物件只是一個記憶體中的資料物件,而最終要在螢屏上看到的結果是通過update 方法把screen 物件的最終結果,一次性的畫在螢屏上, 這種方式可以提高螢屏的繪制效率, 可以提高螢屏每次更新的效率,從而呢可以提高游戲的流暢度.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302040.html
標籤:其他
上一篇:js打地鼠
