Rect 矩形物件使用說明
訂閱 375
本節內容不涉及矩形的碰撞偵測。
Pygame 建立、移動矩形(Rect 物件),以及改變大小影片示範 YouTube
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,h
或l_t,w_h
的 Python 序列物件,其中l
,t
,w
,h
,l_t
,w_h
分別與參數left
,top
,width
,height
,left_top
,width_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
物件,並將他們繪製在了遊戲視窗中。
# 匯入 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
物件擁有一些表示矩形位置和大小的變數,其型別是整數或整數元組。當對表示矩形位置的變數進行修改時,矩形的大小保持不變。當對表示矩形大小的變數進行修改時,矩形的左上角座標保持不變。
變數x
和left
表示矩形左邊緣的 X 座標,變數y
和top
表示矩形上邊緣的 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 值
x
和left
,y
和top
,right
,bottom
是一個整數,其含義與對應的變數相同。
變數width
和w
表示矩形的寬度,變數height
和h
表示矩形的高度,變數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 值
width
和w
,height
和h
是一個整數,size
是一個整數元組,他們的含義與對應的變數相同。
變數topleft
,topright
,bottomright
,bottomleft
是表示矩形左上角,右上角,右下角,左下角座標的整數元組。
rect.topleft
rect.topright
rect.bottomright
rect.bottomleft
rect.topleft = topleft
rect.topright = topright
rect.bottomright = bottomright
rect.bottomleft = bottomleft
- topleft,topright,bottomright,bottomleft 值
topleft
,topright
,bottomright
,bottomleft
是一個整數元組,他們的含義與對應的變數相同。
變數midleft
,midtop
,midright
,midbottom
是表示矩形左邊緣,上邊緣,右邊緣,下邊緣中點座標的整數元組。
rect.midleft
rect.midtop
rect.midright
rect.midbottom
rect.midleft = midleft
rect.midtop = midtop
rect.midright = midright
rect.midbottom = midbottom
- midleft,midtop,midright,midbottom 值
midleft
,midtop
,midright
,midbottom
是一個整數元組,他們的含義與對應的變數相同。
變數centerx
和centery
表示矩形中心的 X 座標和 Y 座標,變數center
是表示矩形中心座標的整數元組。
rect.centerx
rect.centery
rect.center
rect.centerx = centerx
rect.centery = centery
rect.center = center
- centerx,centery,center 值
centerx
,centery
是一個整數,center
是一個整數元組,他們的含義與對應的變數相同。
在下面的範例中,我們調整了矩形的中心位置,這相當於移動了整個矩形。
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)
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
物件。
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
物件的move
和move_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
物件。
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
,那麽表示可以完全包含目標矩形。
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
物件的inflate
,inflate_ip
,scale_by
,scale_by_ip
方法。
Rect
物件的inflate
和inflate_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_by
和scale_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
物件。
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
物件的clamp
和clamp_ip
方法可用於將矩形固定到另一個矩形(由參數表示的目標矩形)的內部,如果已經處於內部(不包括兩個矩形部分重疊的情況),那麽矩形的位置不會產生變化。方法clamp
會改變目前的Rect
物件,方法clamp_ip
會根據固定結果建立並傳回一個新的Rect
物件,原有矩形不會發生變化。
clamp
與clamp_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
物件。
矩形將被固定在目標矩形中的哪個位置?
根據相對位置,clamp
和clamp_ip
方法可能將矩形固定在目標矩形的左上角,右上角,右下角或左下角。比如,當矩形位於目標矩形的左上方時,其將被固定在目標矩形的左上角。
當需要固定的矩形比目標矩形大時
如果需要固定的矩形比目標矩形大,那麽固定後,矩形的中心將與目標矩形的中心相同。
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
物件。
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
物件,該物件的左上角座標與原有矩形相同。
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)
為線段在矩形中的部分的終點座標),或者傳回一個空的元組,當線段在矩形之外時。
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
物件的union
和union_ip
方法可以計算矩形與另一個矩形(由參數表示的目標矩形)的並集,即可以包含兩個矩形的最小矩形。方法union
會將並集儲存在目前的Rect
物件中,方法union_ip
會將並集作為新的Rect
物件傳回,原有矩形不會發生變化。
union
與union_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
物件的unionall
和unionall_ip
方法可以計算矩形與多個矩形的並集,即可以包含這些矩形的最小矩形。方法unionall
會將並集儲存在目前的Rect
物件中,方法unionall_ip
會將並集作為新的Rect
物件傳回,原有矩形不會發生變化。
union(rects)
union_ip(rects)
- rects 參數
rects
參數是一個 Python 序列物件,序列中的每一個元素都表示了一個矩形,他們的書寫格式類似於Rect
物件的建構子的single_arg
參數,你可以檢視Rect 物件一段來了解更多。- union 傳回值
union
方法傳回作為多個矩形並集的新的Rect
物件。
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
。
from pygame import Rect
# 建立一個矩形,並更正錯誤的矩形大小
r = Rect(0, 0, -30, -40)
r.normalize()
print(r)
<rect(-30, -40, 30, 40)>