如何建立子表面?以及取得父表面和頂層表面,取得子表面位置
訂閱 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 物件一段。
在下面的範例中,雖然我們將子表面的透明色彩鍵設定為了紅色,但紅色依然被繪製在了遊戲視窗中。
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_parent
和get_abs_parent
方法,可用於取得表面的父表面和頂層表面。
get_parent()
get_abs_parent()
- 傳回值
get_parent
方法的傳回值是表示父表面的Surface
物件,如果表面本身是頂層表面,則傳回空值None
。get_abs_parent
方法的傳回值是表示頂層表面的Surface
物件,如果表面本身是頂層表面,則傳回其自身。
在下面的範例中,頂層表面s
的父表面和頂層表面分別為None
和其自身。
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_offset
和get_abs_offset
方法,可用於取得子表面在父表面和頂層表面中的位置。
get_parent()
get_abs_parent()
- 傳回值
get_offset
和get_abs_offset
方法的傳回值是形式類似於(x,y)
的 Python 元組,其中x
為子表面在父表面或頂層表面中的 X 座標,y
為子表面在父表面或頂層表面中的 Y 座標,如果表面本身是頂層表面,則傳回(0,0)
。
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)