1. 程式人生 > >Pygame詳解(十一):Rect 物件

Pygame詳解(十一):Rect 物件

class pygame.Rect

Rect 是用於儲存矩形座標的 Pygame 物件。

Rect(left, top, width, height) -> Rect

Rect((left, top), (width, height)) -> Rect

Rect(object) -> Rect

屬性 & 方法

  • pygame.Rect.copy()  —  拷貝 Rect 物件
  • pygame.Rect.move()  —  移動 Rect 物件
  • pygame.Rect.move_ip()  —  原地移動 Rect 物件
  • pygame.Rect.inflate()  —  放大和縮小 Rect 物件的尺寸
  • pygame.Rect.inflate_ip()  —  原地放大和縮小 Rect 物件的尺寸
  • pygame.Rect.clamp()  —  將一個 Rect 物件移動到另一個 Rect 物件的中心
  • pygame.Rect.clamp_ip()  —  原地將一個 Rect 物件移動到另一個 Rect 物件的中心
  • pygame.Rect.clip()  —  獲取兩個 Rect 物件互相重疊的部分
  • pygame.Rect.union()  —  將兩個 Rect 物件合併
  • pygame.Rect.union_ip()  —  原地將兩個 Rect 物件合併
  • pygame.Rect.unionall()  —  將多個 Rect 物件合併
  • pygame.Rect.unionall_ip()  —  原地將多個 Rect 物件合併
  • pygame.Rect.fit()  —  按照一定的寬高比調整 Rect 物件
  • pygame.Rect.normalize()  —  翻轉 Rect 物件(如果尺寸為負數)
  • pygame.Rect.contains()  —  檢測一個 Rect 物件是否完全包含在該 Rect 物件內
  • pygame.Rect.collidepoint()  —  檢測一個點是否包含在該 Rect 物件內
  • pygame.Rect.colliderect()  —  檢測兩個 Rect 物件是否重疊
  • pygame.Rect.collidelist()  —  檢測該 Rect 物件是否與列表中的任何一個矩形有交集
  • pygame.Rect.collidelistall()  —  檢測該 Rect 物件與列表中的每個矩形是否有交集
  • pygame.Rect.collidedict()  —  檢測該 Rect 物件是否與字典中的任何一個矩形有交集
  • pygame.Rect.collidedictall()  —  檢測該 Rect 物件與字典中的每個矩形是否有交集

Pygame 通過 Rect 物件儲存和操作矩形區域。一個 Rect 物件可以由 left,top,width,height 幾個值建立。Rect 也可以是由 Pygame 的物件所建立,它們擁有一個屬性叫“rect”。

任何需要一個 Rect 物件作為引數的 Pygame 函式都可以使用以上值構造一個 Rect。這樣使得作為引數傳遞的同時建立 Rect 成為可能。

Rect 物件中的大部分方法在修改矩形的位置、尺寸後會返回一個新的 Rect 拷貝,原始的 Rect 物件不會有任何改變。但有些方法比較特殊,它們會“原地”修改 Rect 物件(也就是說它們會改動原始的 Rect 物件),這些方法都會以 "ip" 作為字尾(小甲魚溫馨提示:"ip" 即 "in-place" 的縮寫,“原地”的意思)。

對了方便大家移動和對齊,Rect 物件提供以下這些虛擬屬性:

x,y
top, left, bottom, right
topleft, bottomleft, topright, bottomright
midtop, midleft, midbottom, midright
center, centerx, centery
size, width, height
w,h

上邊這些屬性均可以被賦值,例如:

rect1.right = 10
rect2.center = (20,30)

給 size,width,height 屬性賦值將改變矩形的尺寸;給其它屬性賦值將移動矩形。注意:一些屬性是整數,一些是整數對。

如果一個 Rect 物件的 width 或 height 非 0,那麼將在非 0 測試中返回 True。一些方法返回尺寸為 0 的 Rect 物件,用於表示一個非法的矩形。

Rect 物件的座標都是整數,size 的值可以是負數,但在大多數情況下被認為是非法的。

還有一些方法可以實現矩形間碰撞檢測,大多數 Python 的容器可以用於檢索其中的元素與某個 Rect 物件是否碰撞。

Rect 物件覆蓋的範圍並不包含 right 和 bottom 指定的邊緣位置。

溫馨提示,一圖勝千言:

 

這樣的話,如果一個 Rect 物件的 bottom 邊框恰好是另一個 Rect 物件的 top 邊框(即 rect1.bottom == rect2.top),那麼兩矩形就恰好沒有重疊的顯示在螢幕上,rect1.colliderect(rect2) 也將返回 False。

儘管 Rect 物件可以被繼承,但 Rect 的方法返回的是一個全新的 Rect 物件,而不是其子物件。

屬性 & 方法詳解

copy()

拷貝 Rect 物件。

copy() -> Rect

返回一個新的 Rect 物件,擁有與該 Rect 物件相同的位置和尺寸。

Pygame 1.9 新增加的。

move()

移動 Rect 物件。

move(x, y) -> Rect

返回一個新的 Rect 物件。x 和 y 引數可以是正數或負數,用於指定新物件的偏移地址。

move_ip()

原地移動 Rect 物件。

move_ip(x, y) -> None

效果跟 move() 方法一樣,區別是這個直接作用於當前 Rect 物件,而不是返回一個新的。

inflate()

放大和縮小 Rect 物件的尺寸。

inflate(x, y) -> Rect

返回一個新的 Rect 物件。x 和 y 引數指定新的物件放大或縮小多少畫素。新的物件保持與原始 Rect 物件在同一個中心上。

inflate_ip()

原地放大和縮小 Rect 物件的尺寸。

inflate_ip(x, y) -> None

效果跟 inflate() 方法一樣,區別是這個直接作用於當前 Rect 物件,而不是返回一個新的。

clamp()

將一個 Rect 物件移動到另一個 Rect 物件的中心。

clamp(Rect) -> Rect

返回一個新的 Rect 物件,範圍是以 Rect 引數指定的物件為中心,保持原始 Rect 物件的尺寸不變。如果原始 Rect 物件的尺寸比 Rect 引數的要大,那麼保持中心重疊,尺寸不變。

clamp_ip()

原地將一個 Rect 物件移動到另一個 Rect 物件的中心。

clamp_ip(Rect) -> None

效果跟 clamp() 方法一樣,區別是這個直接作用於當前 Rect 物件,而不是返回一個新的。

clip()

獲取兩個 Rect 物件互相重疊的部分。

clip(Rect) -> Rect

返回一個新的 Rect 物件,範圍是原始 Rect 物件與 Rect 引數指定的物件互相重疊的部分。如果兩個 Rect 物件沒有任何重疊,則返回一個 (0, 0, 0, 0) 的 Rect 物件。

union()

將兩個 Rect 物件合併。

union(Rect) -> Rect

返回一個新的 Rect 物件,範圍將包含原始 Rect 物件與 Rect 引數指定的物件。由於結果返回一個新的矩形,所以會產生一些多與的空間。

union_ip()

原地將兩個 Rect 物件合併。

union_ip(Rect) -> None

效果跟 union() 方法一樣,區別是這個直接作用於當前 Rect 物件,而不是返回一個新的。

unionall()

將多個 Rect 物件合併。

unionall(Rect_sequence) -> Rect

返回一個新的 Rect 物件,範圍將包含 Rect_sequence 引數指定的序列中所有的 Rect 物件。

unionall_ip()

原地將多個 Rect 物件合併。

unionall_ip(Rect_sequence) -> None

效果跟 unionall() 方法一樣,區別是這個直接作用於當前 Rect 物件,而不是返回一個新的。

fit()

按照一定的寬高比調整 Rect 物件。

fit(Rect) -> Rect

返回一個新的 Rect 物件,範圍是 Rect 引數的物件按照原始 Rect 物件的寬高比調整得來。

舉個例子:

import pygame
import sys
 
pygame.init()
 
size = width, height = 300, 300

bg = (255, 255, 255) # RGB 白色
 
# 建立指定大小的視窗 Surface
screen = pygame.display.set_mode(size)
# 設定視窗標題
pygame.display.set_caption("Python Demo")

clock = pygame.time.Clock()
 
rect1 = pygame.Rect(0, 0, 100, 50)
rect2 = pygame.Rect(50, 50, 200, 200)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill(bg)
    
    pygame.draw.rect(screen, (255, 0, 0), rect1)
    pygame.draw.rect(screen, (0, 255, 0), rect2)
    pygame.draw.rect(screen, (0, 0, 255), rect1.fit(rect2))
    
    pygame.display.flip()
    
    clock.tick(10)

結果如下:

 

normalize()

翻轉 Rect 物件(如果尺寸為負數)。

normalize() -> None

如果 width 或 height 存在負數,則做出相應的翻轉,使其變為正數。翻轉後的 Rect 仍然在原來的位置,只是修改其相應的屬性值。

contains()

檢測一個 Rect 物件是否完全包含在該 Rect 物件內。

contains(Rect) -> bool

如果 Rect 引數指定的物件完全包含在該 Rect 物件內,返回 True,否則返回 False。

collidepoint()

檢測一個點是否包含在該 Rect 物件內。

collidepoint(x, y) -> bool

collidepoint((x,y)) -> bool

如果給定的點在該 Rect 物件內,返回 True,否則返回 False。

一個點在 Rect 的 right 或 bottom 邊緣上時,並不被認為包含在該矩形內。

colliderect()

檢測兩個 Rect 物件是否重疊。

colliderect(Rect) -> bool

如果兩個 Rect 物件有任何重疊的地方,返回 True,否則返回 False。

注意:right 和 bottom 指定的邊緣位置並不屬於對應的矩形。

collidelist()

檢測該 Rect 物件是否與列表中的任何一個矩形有交集。

collidelist(list) -> index

返回值是第 1 個有相交的矩形所在列表中的索引號(如果有的話),否則返回 -1。

collidelistall()

檢測該 Rect 物件與列表中的每個矩形是否有交集。

collidelistall(list) -> indices

返回一個列表,包含所有與該 Rect 物件有交集的元素;如果一個都沒有,返回一個空列表。

collidedict()

檢測該 Rect 物件是否與字典中的任何一個矩形有交集。

collidedict(dict) -> (key, value)

返回值是第 1 個有相交的矩形所在字典中的鍵和值;如果沒有找到,返回 None。

注意:因為 Rect 物件不是雜湊值,所以不能作為字典的鍵存在,因此比較的只有值。

collidedictall()

檢測該 Rect 物件與字典中的每個矩形是否有交集。

collidedictall(dict) -> [(key, value), ...]

返回一個列表,包含所有與該 Rect 物件有交集的鍵值對;如果一個都沒有,返回一個空字典。

注意:因為 Rect 物件不是雜湊值,所以不能作為字典的鍵存在,因此比較的只有值。