URLhttps://learnscript.net/zh-hant/pygame/sprite/
    複製連結移至說明  範例

    Sprite 精靈物件使用說明

    閱讀 10:54·字數 3270·更新 
    Youtube 頻道
    訂閱 375

    Pygame 中的 sprite 模組

    Pygame 套件的sprite模組,包含了與遊戲精靈有關的函式和類別。遊戲精靈可以被理解為遊戲中一些元素,比如,遊戲角色,道具等,這些元素未必是可見的,比如,一個隱形的敵人。

    Pygame 中的 Sprite 物件

    sprite模組的Sprite物件表示了遊戲中的精靈,該物件一般被包含在一個或多個Group精靈組物件中,其建構子如下。

    Sprite(*groups)

    groups 參數

    可變參數groups所包含的位置參數,是將要新增精靈的精靈組物件(或巢狀包含精靈組物件的序列物件)。

    設定精靈的表面(影像),位置,碰撞區域

    一般情況下,Sprite物件需要名稱為imagerect的變數(可在衍生類別的建構子中或其他位置為他們指派)。其中,image變數是一個Surface表面物件,這決定了精靈的外觀(如果被繪製的話),rect變數是一個Rect矩形物件,他決定了精靈的位置,並被用於碰撞偵測。

    sprite.image
    sprite.rect
    sprite.image = image
    sprite.rect = rect

    image 值

    image是表示精靈外觀的Surface表面物件(表面除了可以繪製影像,也可以繪製簡單的圖形,比如矩形)。

    rect 值

    rect是表示精靈位置和碰撞偵測區域的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方法被呼叫時。dirty1表示需要重繪,為0表示不需要重繪,為2表示始終進行重繪。

    在精靈組物件的draw方法被呼叫後,其包含的精靈的dirty變數會被修改為0,如果此時dirty1的話。這意味著,在沒有必要的情況下,不會重新繪製精靈。另外,如果通過visible屬性設定了精靈是否可見,那麽dirty變數會被設定為1,如果此時dirty0的話。這意味著,設定精靈的可見性將導致其被重繪。

    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物件的blitfill方法的special_flags相同。

    dirtysprite.blendmode
    dirtysprite.blendmode = blendmode

    blendmode 值

    blendmode是表示色彩混合模式的整數。

    繪製

    關於色彩混合模式,色彩混和模式的取值,請參考Pygame 中的色彩混合模式一段。

    Pygame 中的 WeakDirtySprite 物件

    sprite模組中的WeakDirtySprite類別衍生自WeakSpriteDirtySprite類別,擁有這兩個基底類別的共同特性。

    內容分類

    取得原始碼

    本部分所使用的原始碼,可在 GitHub 上瀏覽,網址如下:

    https://github.com/codebeatme/pygame/tree/master/src/zh-hant/sprite

    講解影片

    Pygame 管理精靈的位置、影像、碰撞偵測區域,Sprite 物件簡介·YouTube
    Pygame 通過 Group 精靈組繪製和更新 Sprite 精靈,以及精靈組新增精靈的方式·YouTube