Sprite 精靈物件使用說明
訂閱 375
Pygame 通過 Group 精靈組繪製和更新 Sprite 精靈,以及精靈組新增精靈的方式影片示範 YouTube
Pygame 中的 sprite 模組
Pygame 套件的sprite
模組,包含了與遊戲精靈有關的函式和類別。遊戲精靈可以被理解為遊戲中一些元素,比如,遊戲角色,道具等,這些元素未必是可見的,比如,一個隱形的敵人。
Pygame 中的 Sprite 物件
sprite
模組的Sprite
物件表示了遊戲中的精靈,該物件一般被包含在一個或多個Group
精靈組物件中,其建構子如下。
Sprite(*groups)
- groups 參數
可變參數
groups
所包含的位置參數,是將要新增精靈的精靈組物件(或巢狀包含精靈組物件的序列物件)。
設定精靈的表面(影像),位置,碰撞區域
Pygame 管理精靈的位置、影像、碰撞偵測區域,Sprite 物件簡介影片示範 YouTube
一般情況下,Sprite
物件需要名稱為image
和rect
的變數(可在衍生類別的建構子中或其他位置為他們指派)。其中,image
變數是一個Surface
表面物件,這決定了精靈的外觀(如果被繪製的話),rect
變數是一個Rect
矩形物件,他決定了精靈的位置,並被用於碰撞偵測。
sprite.image
sprite.rect
sprite.image = image
sprite.rect = rect
- image 值
image
是表示精靈外觀的Surface
表面物件(表面除了可以繪製影像,也可以繪製簡單的圖形,比如矩形)。- rect 值
rect
是表示精靈位置和碰撞偵測區域的Rect
矩形物件。
表面,矩形
關於表面物件和矩形物件,請參考如何使用 Surface 表面物件?以及表面(影像)的透明度,透明色彩鍵,色彩,大小等問題和Rect 矩形物件使用說明兩節。
設定繪製精靈的圖層
Sprite
物件的layer
屬性是一個整數,表示用於繪製精靈的圖層,數值較小的圖層將優先被繪製,這意味著他們可能會被後來的圖層覆蓋。
sprite.layer
sprite.layer = layer
- layer 值
layer
是表示用於繪製精靈的圖層的整數。
layer 屬性僅在 LayeredUpdates 型別的精靈組中發揮作用
如果將精靈加入非LayeredUpdates
型別的精靈組,那麽設定layer
屬性可能不會產生任何效果,正確的做法是將精靈加入型別為LayeredUpdates
的精靈組物件(或繼承自LayeredUpdates
的物件)。
使用 layer 屬性時的限製
如果你希望通過layer
屬性設定精靈的圖層,那麽需要在精靈加入任何精靈組之前,否則將導致例外狀況AttributeError: Can't set layer directly after adding to group. Use group.change_layer(sprite, new_layer) instead.
。
如果layer
屬性從未被設定過(由開發人員或 Pygame 自身),那麽讀取他將導致例外狀況AttributeError: '…' object has no attribute '_layer'. Did you mean: 'layer'?
。
將精靈新增至精靈組
Sprite
物件的add
方法,可用於將精靈物件新增至一個或多個Group
精靈組物件。
add(*groups)
- groups 參數
可變參數
groups
所包含的位置參數,是將要新增精靈的精靈組物件(或巢狀包含精靈組物件的序列物件)。
將精靈從精靈組中移除
Sprite
物件的remove
方法,可用於將精靈物件從一個或多個Group
精靈組物件中移除。
remove(*groups)
- groups 參數
可變參數
groups
所包含的位置參數,是將要移除精靈的精靈組物件(或巢狀包含精靈組物件的序列物件)。
Sprite
物件的kill
方法,可用於從所有包含該精靈的精靈組物件中,移除該精靈。該方法並不會真正的終結(「殺死」)精靈物件,他僅僅是從精靈組物件中移除了精靈,這些被移除的精靈依然可以被使用,包括重新加入新的精靈組。
kill()
判斷精靈是否在任意精靈組中
Sprite
物件的alive
方法,可用於判斷精靈是否被包含在任意某個精靈組物件中。
alive()
- 傳回值
如果
alive
方法傳回True
,那麽表示精靈被包含某一個或多個精靈組物件中。
取得所有包含精靈的精靈組
Sprite
物件的groups
方法,可用於取得所有包含該精靈的精靈組物件。
groups()
- 傳回值
groups
方法傳回一個串列,包含了所有包含該精靈的精靈組物件。
更新精靈
預設情況下,Sprite
物件的update
方法不會實作任何效果,其參數通常來自於所在的精靈組物件的update
方法。如果要使用update
方法,應在衍生類別中覆寫他,以實作與精靈有關的狀態的更新,比如,角色判斷自己的生命值是否小於等於0
。
update(*args, **kwargs)
- args 參數
可變參數
args
所包含的位置參數,通常來自於其所在精靈組物件的update
方法。- kwargs 參數
可變參數
kwargs
所包含的關鍵字參數,通常來自於其所在精靈組物件的update
方法。
Pygame 中的 WeakSprite 物件
sprite
模組中的WeakSprite
類別衍生自Sprite
類別,與Sprite
不同的是,WeakSprite
對包含自己的精靈組物件進行弱式參考。這意味著如果一個精靈組物件只包含WeakSprite
物件,並且精靈組物件沒有被強式參考,那麽該精靈組物件可以被記憶體回收。
WeakSprite 物件的使用案例
如果不再使用的精靈被開發人員從精靈組中移除,WeakSprite
物件的使用案例可能並不多,因為這使得回收精靈組與被移除的精靈無關。但對於一些臨時的精靈組,WeakSprite
物件可能是有用的。
Pygame 中的 DirtySprite 物件
sprite
模組中的臟精靈類別DirtySprite
衍生自Sprite
類別,擁有比Sprite
更多的功能,其中最重要的是可以設定是否需要重繪,這表示在每一次的遊戲迴圈中,你可以根據情況來決定是否重新繪製某個精靈,對於始終固定不變或很少改變的元素,僅在必要時對其進行繪製,可以提高遊戲的算繪效率。
DirtySprite 物件擁有的功能可能僅在 LayeredDirty 型別的精靈組中有效
如果將臟精靈加入非LayeredDirty
型別的精靈組,那麽臟精靈的一些效果可能不會顯現,正確的做法是將臟精靈加入型別為LayeredDirty
的精靈組物件(或繼承自LayeredDirty
的物件)。
取得和設定臟精靈表面(影像)被繪製的區域
DirtySprite
類別的source_rect
變數是一個Rect
矩形物件(預設值為None
),表示需要繪製臟精靈表面的哪個區域(當然表面中除了可以繪製影像,也可以直接繪製簡單的圖形,比如矩形)。如果該變數為None
,那麽將繪製臟精靈的整個表面。
dirtysprite.source_rect
dirtysprite.source_rect = source_rect
- source_rect 值
source_rect
是表示需要繪製的區域,以表面的左上角座標為原點。
取得和設定臟精靈是否需要重繪
DirtySprite
類別的dirty
變數是一個整數(預設值為1
),表示是否需要重繪精靈,當其所在的精靈組物件的draw
方法被呼叫時。dirty
為1
表示需要重繪,為0
表示不需要重繪,為2
表示始終進行重繪。
在精靈組物件的draw
方法被呼叫後,其包含的精靈的dirty
變數會被修改為0
,如果此時dirty
為1
的話。這意味著,在沒有必要的情況下,不會重新繪製精靈。另外,如果通過visible
屬性設定了精靈是否可見,那麽dirty
變數會被設定為1
,如果此時dirty
為0
的話。這意味著,設定精靈的可見性將導致其被重繪。
dirtysprite.dirty
dirtysprite.dirty = dirty
- dirty 值
dirty
是表示精靈是否需要重繪的整數。
取得和設定臟精靈是否可見
DirtySprite
類別的visible
屬性是一個整數(預設值為1
),表示臟精靈是否可見,即是否被繪製,1
表示可見,0
表示不可見。
dirtysprite.visible
dirtysprite.visible = visible
- visible 值
visible
是表示臟精靈是否可見的整數。
visible 屬性為 0 並不會封鎖呼叫 update 方法
visible
屬性為0
將導致臟精靈不被繪製,但不會封鎖臟精靈的update
方法被執行,如果你了呼叫精靈組的update
方法。
取得和設定臟精靈的色彩混合模式
DirtySprite
類別的blendmode
變數(預設值為0
),表示在繪製臟精靈時所采用的色彩混合模式,其取值與Surface
物件的blit
或fill
方法的special_flags
相同。
dirtysprite.blendmode
dirtysprite.blendmode = blendmode
- blendmode 值
blendmode
是表示色彩混合模式的整數。
繪製
關於色彩混合模式,色彩混和模式的取值,請參考Pygame 中的色彩混合模式一段。
Pygame 中的 WeakDirtySprite 物件
sprite
模組中的WeakDirtySprite
類別衍生自WeakSprite
和DirtySprite
類別,擁有這兩個基底類別的共同特性。
內容分類
取得原始碼
本部分所使用的原始碼,可在 GitHub 上瀏覽,網址如下:
https://github.com/codebeatme/pygame/tree/master/src/zh-hant/sprite
講解影片
Pygame 管理精靈的位置、影像、碰撞偵測區域,Sprite 物件簡介·YouTube
Pygame 通過 Group 精靈組繪製和更新 Sprite 精靈,以及精靈組新增精靈的方式·YouTube