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

    如何建立子表面?以及取得父表面和頂層表面,取得子表面位置

    閱讀 3:53·字數 1166·發佈 
    Youtube 頻道
    訂閱 375

    為表面建立子表面

    在 Pygame 中,你可以為遊戲表面新增子表面,擁有子表面的表面被稱為父表面。需要指出的是,建立子表面並不會產生新的像素,對子表面中的像素進行修改等同於對父表面中的像素進行修改,反之亦成立。此外,子表面擁有與父表面相同的調色板,透明色彩鍵和透明度,但修改他們並不能達到預期效果,因為如何繪製取決於父表面的相關設定。

    Surface物件的subsurface方法,可根據給出的矩形資訊,建立遊戲表面的子表面,其參數與Rect物件的建構子的參數類似,其中參數rect等同於Rect建構子的參數single_arg

    subsurface(left, top, width, height)
    subsurface(left_top, width_height)
    subsurface(rect)

    傳回值

    subsurface方法的傳回值是表示子表面的Surface物件。

    矩形

    關於Rect物件的建構子的參數,你可以檢視Pygame 中的 Rect 物件一段。

    在下面的範例中,雖然我們將子表面的透明色彩鍵設定為了紅色,但紅色依然被繪製在了遊戲視窗中。

    create.py
    from pygame import Surface, SRCALPHA
    
    # 建立遊戲表面和子表面 s = Surface([800, 600], SRCALPHA) c = s.subsurface(0, 0, 100, 100)
    s.fill('#ffff0099', [0, 0, 800, 600])
    # 將子表面的透明色彩鍵設定為紅色,但不會達到預期效果 c.set_colorkey('#ff0000') c.fill('#ff0000', [0, 0, 100, 100]) # 檢視父表面的像素是否已經被修改 print(s.get_at([0, 0]))
    # 建立遊戲視窗並繪製 s from pygame import display w = display.set_mode((800, 600)) w.blit(s, (0, 0)) display.flip()
    import time time.sleep(3)

    取得表面的父表面

    除了可以為遊戲表面建立子表面,你還可以為已經建立的子表面建立子表面,在這種巢狀關系中,其父表面不存在的表面是其他所有子表面的頂層表面。

    Surface物件的get_parentget_abs_parent方法,可用於取得表面的父表面和頂層表面。

    get_parent()
    get_abs_parent()

    傳回值

    get_parent方法的傳回值是表示父表面的Surface物件,如果表面本身是頂層表面,則傳回空值Noneget_abs_parent方法的傳回值是表示頂層表面的Surface物件,如果表面本身是頂層表面,則傳回其自身。

    在下面的範例中,頂層表面s的父表面和頂層表面分別為None和其自身。

    parent.py
    from pygame import Surface
    
    # 建立遊戲表面和子表面 s = Surface([800, 600]) c = s.subsurface(0, 0, 10, 10) cc = c.subsurface(0, 0, 10, 10)
    # cc 的父表面為 c print(cc.get_parent() == c) # cc 的頂層表面為 s print(cc.get_abs_parent() == s) # 取得 s 的父表面和頂層表面 print(s.get_parent()) print(s.get_abs_parent())
    True
    True
    None
    <Surface(800x600x32 SW)>

    取得表面的位置

    Surface物件的get_offsetget_abs_offset方法,可用於取得子表面在父表面和頂層表面中的位置。

    get_parent()
    get_abs_parent()

    傳回值

    get_offsetget_abs_offset方法的傳回值是形式類似於(x,y)的 Python 元組,其中x為子表面在父表面或頂層表面中的 X 座標,y為子表面在父表面或頂層表面中的 Y 座標,如果表面本身是頂層表面,則傳回(0,0)

    position.py
    from pygame import Surface
    
    # 建立遊戲表面和子表面 s = Surface([800, 600]) c = s.subsurface(100, 200, 50, 50) cc = c.subsurface(12, 13, 1, 1)
    # 取得表面 cc 在父表面和頂層表面中的位置 print(cc.get_offset()) print(cc.get_abs_offset())
    (12, 13)
    (112, 213)

    原始碼

    src/zh-hant/surface/child·codebeatme/pygame·GitHub