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

    Rect 矩形物件使用說明

    閱讀 23:07·字數 6936·發佈 
    Youtube 頻道
    訂閱 375

    本節內容不涉及矩形的碰撞偵測。

    Pygame 中的 Rect 物件

    矩形在遊戲開發中具有重要的作用,除了可以用於定位和繪製,還可以進行高效的碰撞偵測。在 Pygame 套件中,Rect物件被用於表示遊戲中的矩形,該物件包含一系列與矩形相關的變數,以及用於矩形運算的方法,以下是其建構子。

    Rect(left, top, width, height)
    Rect(left_top, width_height)
    Rect(single_arg)

    left 參數

    left參數是一個表示矩形左邊緣的 X 座標的浮點數。

    top 參數

    top參數是一個表示矩形上邊緣的 Y 座標的浮點數。

    width 參數

    width參數是一個表示矩形寬度的浮點數。

    height 參數

    height參數是一個表示矩形高度的浮點數。

    left_top 參數

    left_top參數表示矩形左上角的座標,他可以是一個依次包含 X 和 Y 座標的 Python 浮點數序列物件,或一個 PygameVector2物件(物件的x變數對應 X 座標,物件的y變數對應 Y 座標)。比如,元組(10.5,20.5)

    width_height 參數

    width_height參數表示矩形的大小,他可以是一個依次包含寬度和高度的 Python 浮點數序列物件,或一個 PygameVector2物件(物件的x變數對應寬度,物件的y變數對應高度)。比如,串列[100.25,9.75]

    single_arg 參數

    single_arg參數為包含矩形資訊的物件,他可以是另一個Rect物件,或者依次包含元素l,t,w,hl_t,w_h的 Python 序列物件,其中ltwhl_tw_h分別與參數lefttopwidthheightleft_topwidth_height的取值和含義相同。比如,[10.5,20.5,100.25,9.75]((10.5,20.5),[100.25,9.75])

    此外,參數single_arg還可以是一個擁有rect特性的物件,rect的傳回值符合以上要求之一。

    Rect 物件會將浮點數轉換為整數

    雖然Rect物件的建構子和一些其他特性(方法,變數)允許使用浮點數,但這些浮點數會被轉換為整數,其效果類似於將浮點數傳遞給int型別的建構子。

    比如,當指定Rect物件的左上角座標為(10.5,20.5)時,等同於使用整數元組(10,20)

    在下面的範例中,我們使用了不同的建構子建立了多個Rect物件,並將他們繪製在了遊戲視窗中。

    create.py
    # 匯入 Rect,Vector2 物件
    from pygame import Rect, Vector2
    
    # 建立不同的矩形,浮點數會被轉換為整數 # X 座標 10,Y 座標 20,寬度 50,高度 99 r1 = Rect(10.5, 20.5, 50.9, 99.9) # X 座標 110,Y 座標 100,寬度 20,高度 25 r2 = Rect((110, 100), [20, 25]) # X 座標 200,Y 座標 210,寬度 20,高度 50 r3 = Rect(Vector2(200, 210), Vector2(20, 50.5)) # X 座標 300,Y 座標 100,寬度 40,高度 45 r4 = Rect([(300, 100), [40, 45]])
    # 建立遊戲視窗,並使用矩形進行繪製 from pygame import display, draw s = display.set_mode((800, 600)) draw.rect(s, 0xff0000, r1) draw.rect(s, 0x00ff00, r2) draw.rect(s, 0xff00ff, r3) draw.rect(s, 0x0000ff, r4) display.flip()
    import time time.sleep(2)

    取得和設定矩形資訊

    Rect物件擁有一些表示矩形位置和大小的變數,其型別是整數或整數元組。當對表示矩形位置的變數進行修改時,矩形的大小保持不變。當對表示矩形大小的變數進行修改時,矩形的左上角座標保持不變。

    變數xleft表示矩形左邊緣的 X 座標,變數ytop表示矩形上邊緣的 Y 座標。變數right表示矩形右邊緣的 X 座標,變數bottom表示矩形下邊緣的 Y 座標。

    rect.x
    rect.left
    rect.y
    rect.top
    rect.right
    rect.bottom
    rect.x = x
    rect.left = left
    rect.y = y
    rect.top = top
    rect.right = right
    rect.bottom = bottom

    x,left,y,top,right,bottom 值

    xleftytoprightbottom是一個整數,其含義與對應的變數相同。

    變數widthw表示矩形的寬度,變數heighth表示矩形的高度,變數size是表示矩形大小的整數元組(依次包含寬度和高度)。

    rect.width
    rect.w
    rect.height
    rect.h
    rect.size
    rect.width = width
    rect.w = w
    rect.height = height
    rect.h = h
    rect.size = size

    width,w,height,h,size 值

    widthwheighth是一個整數,size是一個整數元組,他們的含義與對應的變數相同。

    變數toplefttoprightbottomrightbottomleft是表示矩形左上角,右上角,右下角,左下角座標的整數元組。

    rect.topleft
    rect.topright
    rect.bottomright
    rect.bottomleft
    rect.topleft = topleft
    rect.topright = topright
    rect.bottomright = bottomright
    rect.bottomleft = bottomleft

    topleft,topright,bottomright,bottomleft 值

    toplefttoprightbottomrightbottomleft是一個整數元組,他們的含義與對應的變數相同。

    變數midleftmidtopmidrightmidbottom是表示矩形左邊緣,上邊緣,右邊緣,下邊緣中點座標的整數元組。

    rect.midleft
    rect.midtop
    rect.midright
    rect.midbottom
    rect.midleft = midleft
    rect.midtop = midtop
    rect.midright = midright
    rect.midbottom = midbottom

    midleft,midtop,midright,midbottom 值

    midleftmidtopmidrightmidbottom是一個整數元組,他們的含義與對應的變數相同。

    變數centerxcentery表示矩形中心的 X 座標和 Y 座標,變數center是表示矩形中心座標的整數元組。

    rect.centerx
    rect.centery
    rect.center
    rect.centerx = centerx
    rect.centery = centery
    rect.center = center

    centerx,centery,center 值

    centerxcentery是一個整數,center是一個整數元組,他們的含義與對應的變數相同。

    在下面的範例中,我們調整了矩形的中心位置,這相當於移動了整個矩形。

    info.py
    from pygame import Rect
    
    # 建立一個矩形 r = Rect(10, 20, 30, 40)
    # 顯示矩形的位置和大小 print(f'{r.x} {r.y} {r.right} {r.bottom}') print(f'{r.w} {r.h} {r.size}')
    # 顯示矩形的四個頂點的座標 print(f'{r.topleft} {r.topright} {r.bottomright} {r.bottomleft}') # 顯示矩形的四個邊緣的中點的座標 print(f'{r.midleft} {r.midtop} {r.midright} {r.midbottom}') # 顯示矩形中心的座標 print(f'{r.centerx} {r.centery} {r.center}')
    # 修改矩形的中心位置 r.center = (100, 100) # 顯示矩形的位置 print(f'{r.x} {r.y} {r.right} {r.bottom}')
    # 位置和大小
    10 20 40 60
    30 40 (30, 40)
    # 頂點座標
    (10, 20) (40, 20) (40, 60) (10, 60)
    # 邊緣中點座標
    (10, 40) (25, 20) (40, 40) (25, 60)
    # 中心座標
    25 40 (25, 40)
    # 修改後的位置
    85 80 115 120

    更新矩形資訊

    Rect物件的update方法可用於更新矩形的位置和大小,該方法的參數與Rect物件的建構子的參數類似,你可以檢視Rect 物件一段來了解他們。

    update(left, top, width, height)
    update(left_top, width_height)
    update(single_arg)

    update.py
    from pygame import Rect
    
    # X 座標 10,Y 座標 20,寬度 30,高度 40 r = Rect(10, 20, 30, 40) # 更新矩形位置和大小,X 和 Y 座標為 0,寬度和高度為 10 r.update([0, 0], (10, 10))

    複製矩形

    Rect物件的copy方法傳回一個新的Rect物件,新物件所表示的矩形的位置和大小,與原有的矩形相同,即新物件的所有變數的值與原有物件相同。

    copy()

    傳回值

    copy方法傳回覆製的Rect物件。

    copy.py
    from pygame import Rect
    
    # 建立一個矩形,然後複製他 r1 = Rect(0, 0, 100, 100) r2 = r1.copy() # 對第一個矩形進行修改,並不會影響第二個矩形 r1.bottomright = (200, 200)
    print(f'第一個矩形:{r1}') print(f'第二個矩形:{r2}')
    第一個矩形:<rect(100, 100, 100, 100)>
    第二個矩形:<rect(0, 0, 100, 100)>

    移動矩形

    Rect物件的movemove_ip方法可用於移動矩形,其中move_ip會移動目前的Rect物件,move會根據移動的位置建立並傳回一個新的Rect物件,原有矩形不會發生變化。

    move(x, y)
    move(move_by)
    move_ip(x, y)
    move_ip(move_by)

    x 參數

    x參數是一個浮點數,表示矩形在 X 軸上的移動距離。

    y 參數

    y參數是一個浮點數,表示矩形在 Y 軸上的移動距離。

    move_by 參數

    move_by參數是一個依次包含 X 軸移動距離和 Y 軸移動距離的 Python 浮點數序列物件,或一個 PygameVector2物件(物件的x變數對應 X 軸移動距離,物件的y變數對應 Y 軸移動距離)。

    move 傳回值

    move方法傳回移動後的新的Rect物件。

    move.py
    from pygame import Rect, Vector2
    
    # 建立一個矩形,並計算移動後的矩形 r1 = Rect(0, 0, 10, 20) r2 = r1.move(11, 9) print(r2)
    # 移動矩形 r1 自身 r1.move_ip(Vector2(5, 5)) print(r1)
    <rect(11, 9, 10, 20)>
    <rect(5, 5, 10, 20)>

    判斷矩形是否包含另一矩形

    Rect物件的contains方法可用於判斷矩形是否能夠完全包含另一個矩形(由參數表示的目標矩形)。

    contains方法的參數,與Rect物件的建構子的參數類似(其中參數rect等同於參數single_arg),你可以檢視Rect 物件一段來了解他們。

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

    傳回值

    如果contains方法傳回True,那麽表示可以完全包含目標矩形。

    contains.py
    from pygame import Rect
    
    # 判斷矩形 r1 是否能夠完全包含其他矩形 r1 = Rect(0, 0, 10, 10) r2 = Rect(-10, -10, 10, 10) print(r1.contains(r2)) print(r1.contains([5, 5], [10, 10])) print(r1.contains(2, 2, 6, 6))
    False
    False
    True

    保持中心不變並變更矩形大小

    當你希望改變矩形的大小並保持矩形的中心不變時,可以使用Rect物件的inflateinflate_ipscale_byscale_by_ip方法。

    Rect物件的inflateinflate_ip方法可用於調整矩形的大小,並盡可能確保矩形的中心不發生改變,其中inflate_ip會改變目前的Rect物件,inflate會根據調整結果建立並傳回一個新的Rect物件,原有矩形不會發生變化。

    inflate(x, y)
    inflate(inflate_by)
    inflate_ip(x, y)
    inflate_ip(inflate_by)

    x 參數

    x參數是一個浮點數,表示矩形增加的寬度,如果為負數則寬度減小。

    y 參數

    y參數是一個浮點數,表示矩形增加的高度,如果為負數則高度減小。

    inflate_by 參數

    inflate_by參數是一個依次包含增加的寬度和增加的高度的 Python 浮點數序列物件,或一個 PygameVector2物件(物件的x變數對應增加的寬度,物件的y變數對應增加的高度)。

    inflate 傳回值

    inflate方法傳回大小改變後的新的Rect物件。

    Rect物件的scale_byscale_by_ip方法可用於縮放矩形,並盡可能確保矩形的中心不發生改變,其中scale_by_ip會改變目前的Rect物件,scale_by會根據縮放結果建立並傳回一個新的Rect物件,原有矩形不會發生變化。

    scale_by(x, y)
    scale_by_ip(x, y)

    x 參數

    x參數是一個浮點數,表示矩形寬度的縮放比例。

    y 參數

    y參數是一個浮點數,表示矩形高度的縮放比例,如果僅提供參數x,那麽視參數y與參數x相同。

    scale 傳回值

    scale方法傳回縮放後的新的Rect物件。

    change_size.py
    from pygame import Rect
    
    # 建立一個矩形 r1 = Rect(0, 0, 10, 10) # 矩形的寬度增加 3,高度增加 2 r2 = r1.inflate(3, 2) print(r2) # 調整矩形 r1 自身的大小 r1.inflate_ip((-20, -30)) print(r1)
    # 建立一個矩形 r3 = Rect(0, 0, 10, 10) # 矩形的寬度和高度增加一倍 r4 = r3.scale_by(2) print(r4) # 縮放矩形 r3 自身 r3.scale_by_ip(2.5, 3.5) print(r3)
    # 寬度加 3,高度加 2
    <rect(-1, -1, 13, 12)>
    # 寬度減 20,高度減 30
    <rect(10, 15, -10, -20)>
    # 寬度和高度擴大至 2 倍
    <rect(-5, -5, 20, 20)>
    # 寬度擴大至 2.5 倍,高度擴大至 3.5 倍
    <rect(-7, -12, 25, 35)>

    將矩形固定到另一矩形中

    Rect物件的clampclamp_ip方法可用於將矩形固定到另一個矩形(由參數表示的目標矩形)的內部,如果已經處於內部(不包括兩個矩形部分重疊的情況),那麽矩形的位置不會產生變化。方法clamp會改變目前的Rect物件,方法clamp_ip會根據固定結果建立並傳回一個新的Rect物件,原有矩形不會發生變化。

    clampclamp_ip方法的參數,與Rect物件的建構子的參數類似(其中參數rect等同於參數single_arg),你可以檢視Rect 物件一段來了解他們。

    clamp(rect)
    clamp(left_top, width_height)
    clamp(left, top, width, height)
    clamp_ip(rect)
    clamp_ip(left_top, width_height)
    clamp_ip(left, top, width, height)

    clamp 傳回值

    clamp方法傳回固定後的新的Rect物件。

    矩形將被固定在目標矩形中的哪個位置?

    根據相對位置,clampclamp_ip方法可能將矩形固定在目標矩形的左上角,右上角,右下角或左下角。比如,當矩形位於目標矩形的左上方時,其將被固定在目標矩形的左上角。

    當需要固定的矩形比目標矩形大時

    如果需要固定的矩形比目標矩形大,那麽固定後,矩形的中心將與目標矩形的中心相同。

    clamp.py
    from pygame import Rect
    
    # 矩形 r1 作為容器 r1 = Rect(0, 0, 100, 100)
    # 矩形 r2 位於 r1 的右上方 r2 = Rect(500, -500, 50, 50) # 固定在 r1 內部(右上角) print(r2.clamp(r1))
    # 矩形 r3 位於 r1 的左下方 r3 = Rect(-500, 500, 50, 50) # 固定在 r1 內部(左下角) print(r3.clamp(r1))
    # 矩形 r4 的一部分與 r1 重疊 r4 = Rect(-10, -10, 50, 50) # 固定在 r1 內部(左上角) print(r4.clamp(r1))
    # 矩形 r5 位於 r1 內部,但中心不相同 r5 = Rect(10, 10, 20, 20) # 不會發生變化 print(r5.clamp(r1))
    # 矩形 r6 比 r1 大 r6 = Rect(-1000, -1000, 200, 200) # r6 的中心將於 r1 相同 r6.clamp_ip(r1) print(r6.center, r1.center)
    # 固定在右上角
    <rect(50, 0, 50, 50)>
    # 固定在左下角
    <rect(0, 50, 50, 50)>
    # 固定在左上角
    <rect(0, 0, 50, 50)>
    # 沒有變化
    <rect(10, 10, 20, 20)>
    # 中心相同
    (50, 50) (50, 50)

    調整並移動矩形以填入另一矩形

    Rect物件的fit方法可以移動矩形並按照原有寬高比例調整大小,以將其填入到另一個矩形(由參數表示的目標矩形)中,兩個矩形的中心位置相同,而計算的結果將作為新的Rect物件傳回,原有的矩形不會發生變化。

    fit方法的參數,與Rect物件的建構子的參數類似(其中參數rect等同於參數single_arg),你可以檢視Rect 物件一段來了解他們。

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

    傳回值

    fit方法傳回移動並調整大小後的新的Rect物件。

    fit.py
    from pygame import Rect
    
    # 建立一個矩形,並填入到其他幾個矩形中 r1 = Rect(0, 0, 100, 100) print(r1.fit(100, 100, 100, 50)) print(r1.fit((-20, -50), (200, 300)))
    <rect(125, 100, 50, 50)>
    <rect(-20, 0, 200, 200)>

    裁剪矩形與另一矩形的重疊部分

    Rect物件的clip方法可以計算矩形與另一個矩形(由參數表示的目標矩形)的重疊部分,並將重疊部分作為新的Rect物件傳回。

    clip方法的參數,與Rect物件的建構子的參數類似(其中參數rect等同於參數single_arg),你可以檢視Rect 物件一段來了解他們。

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

    傳回值

    clip方法傳回表示兩個矩形重疊部分的Rect物件。

    當矩形與目標矩形沒有重疊的部分時

    如果矩形與目標矩形沒有重疊的部分,那麽clip方法將傳回一個大小為零(寬度和高度為零)的Rect物件,該物件的左上角座標與原有矩形相同。

    clip.py
    from pygame import Rect
    
    # 建立兩個矩形並計算他們重疊的部分 r1 = Rect(0, 0, 100, 100) r2 = Rect(-50, -50, 100, 100) print(r2.clip(r1))
    # 矩形 r2 與參數表示的矩形不重疊 print(r2.clip([100, 100], [10, 10]))
    <rect(0, 0, 50, 50)>
    # 寬度和高度為零
    <rect(-50, -50, 0, 0)>

    裁剪線段在矩形中的部分

    Rect物件的clipline方法可以計算線段在矩形中的部分,並傳回該部分的端點座標。

    clipline(x1, x2, x3, x4)
    clipline(first_coordinate, second_coordinate)
    clipline(rect_arg)

    x1 參數

    x1參數是一個浮點數,表示線段起點的 X 座標。

    x2 參數

    x2參數是一個浮點數,表示線段起點的 Y 座標。

    x3 參數

    x3參數是一個浮點數,表示線段終點的 X 座標。

    x4 參數

    x4參數是一個浮點數,表示線段終點的 Y 座標。

    first_coordinate 參數

    first_coordinate參數表示線段的起點座標,他可以是一個依次包含 X 和 Y 座標的 Python 浮點數序列物件,或一個 PygameVector2物件(物件的x變數對應 X 座標,物件的y變數對應 Y 座標)。

    second_coordinate 參數

    second_coordinate參數表示線段的終點座標,他可以是一個依次包含 X 和 Y 座標的 Python 浮點數序列物件,或一個 PygameVector2物件(物件的x變數對應 X 座標,物件的y變數對應 Y 座標)。

    rect_arg 參數

    rect_arg參數與Rect建構子的rect參數類似,你可以檢視Rect 物件一段來了解他。如果將該參數視為矩形資訊,那麽矩形的左上角為線段的起點,矩形的寬度和高度分別為線段終點的 X 座標和 Y 座標。

    傳回值

    clipline方法傳回一個形式類似於((sx,sy),(ex,ey))的元組(其中(sx,sy)為線段在矩形中的部分的起點座標,(ex,ey)為線段在矩形中的部分的終點座標),或者傳回一個空的元組,當線段在矩形之外時。

    clipline.py
    from pygame import Rect, Vector2
    
    # 建立一個矩形,並計算線段在該矩形中的部分 r = Rect(0, 0, 100, 100) # 線段的一部分在矩形中 print(r.clipline(-1, -1, 50, 50)) # 線段完全在矩形中 print(r.clipline((50, 50), [60, 60])) # 線段穿過了矩形 print(r.clipline(Rect(10, -10, 10, 110))) # 線段在矩形外 print(r.clipline(Vector2(-1, 0), Vector2(0, 100)))
    # 線段的一部分在矩形中
    ((0, 0), (50, 50))
    # 線段完全在矩形中
    ((50, 50), (60, 60))
    # 線段穿過了矩形
    ((10, 0), (10, 99))
    # 線段在矩形外
    ()

    合併矩形

    Rect物件的unionunion_ip方法可以計算矩形與另一個矩形(由參數表示的目標矩形)的並集,即可以包含兩個矩形的最小矩形。方法union會將並集儲存在目前的Rect物件中,方法union_ip會將並集作為新的Rect物件傳回,原有矩形不會發生變化。

    unionunion_ip方法的參數,與Rect物件的建構子的參數類似(其中參數rect等同於參數single_arg),你可以檢視Rect 物件一段來了解他們。

    union(rect)
    union(left_top, width_height)
    union(left, top, width, height)
    union_ip(rect)
    union_ip(left_top, width_height)
    union_ip(left, top, width, height)

    union 傳回值

    union方法傳回作為矩形並集的新的Rect物件。

    Rect物件的unionallunionall_ip方法可以計算矩形與多個矩形的並集,即可以包含這些矩形的最小矩形。方法unionall會將並集儲存在目前的Rect物件中,方法unionall_ip會將並集作為新的Rect物件傳回,原有矩形不會發生變化。

    union(rects)
    union_ip(rects)

    rects 參數

    rects參數是一個 Python 序列物件,序列中的每一個元素都表示了一個矩形,他們的書寫格式類似於Rect物件的建構子的single_arg參數,你可以檢視Rect 物件一段來了解更多。

    union 傳回值

    union方法傳回作為多個矩形並集的新的Rect物件。

    union.py
    from pygame import Rect
    
    # 建立一個矩形,並計算與其他矩形的並集 r = Rect(0, 0, 10, 10) print(r.union(30, 30, 10, 10)) print(r.unionall([(30, 30, 10, 10), [[-10, -10], [5, 5]]])) r.union_ip((-10, -10, 15, 15)) print(r)
    <rect(0, 0, 40, 40)>
    <rect(-10, -10, 50, 50)>
    <rect(-10, -10, 20, 20)>

    更正大小為負數的矩形

    如果一個Rect物件所表示的矩形的大小為負數,那麽可以呼叫其normalize方法將大小更正為正數,這會導致矩形的寬度或高度(或兩者)發生變化。

    需要指出的是,雖然normalize方法不會改變原有矩形的位置,但Rect物件的一些變數會發生變化,比如topleft(因其原本表示的並非真正的左上角)。

    normalize()

    在下面的範例中,矩形原本的左上角 X 和 Y 座標均為0(其實是右下角),在更正錯誤之後,矩形的左上角 X,Y 座標分別為-30-40

    normalize.py
    from pygame import Rect
    
    # 建立一個矩形,並更正錯誤的矩形大小 r = Rect(0, 0, -30, -40) r.normalize() print(r)
    <rect(-30, -40, 30, 40)>

    原始碼

    src/zh-hant/rect·codebeatme/pygame·GitHub

    講解影片

    Pygame 建立、移動矩形(Rect 物件),以及改變大小·YouTube