轉載注明鏈接:https://www.cnblogs.com/liquancai/p/13256388.html
pygame 的精靈使用
pygame.sprite.Sprite 是 pygame 中用來實現精靈的一個類,在使用時並不需要對它實例化,只需要繼承它,然后按需寫出自己的類,因此非常簡單、使用。
1. 精靈
精靈可以被認為是一個個小圖片(幀)序列(例如人物行走),它可以在屏幕上移動,並且可以與其他圖形對象交互。精靈圖像可以是用 pygame 繪制形狀函數繪制的形狀,也可以是圖像文件。
2. Sprite 類的成員
pygame.sprite.Sprite 用來實現精靈類,Sprite 的數據成員和函數方法主要如下。
-
self.image
其負責顯示什么圖形。例如
self.image = pygame.Surface([x, y])
說明該精靈是一個 x * y 大小的矩形,self.image = pygame.image.load(filename)
說明該精靈顯示 filename 這個圖片文件。self.image.fill([color])
負責對 self.image 進行着色,例如:self.image = pygame.Surface([x, y]) self.image.fill((255, 0, 0)) # 對 x * y 大小的矩形填充紅
-
self.rect
其負責在哪里顯示。一般來說,先用
self.rect = self.image.get_rect()
來獲取 image 的矩形區域,然后給 self.rect 設定顯示的位置,一般用 self.rect.topleft 來確定左上角的位置,當然也可以 self.rect.topright、 self.rect.bottomleft 和 self.rect.bottomright 來確定其它幾個角的位置。另外,self.rect.top 、self.rect.bottom 、self.rect.left 、self.rect.right 分別表示上、下、左、右。
-
self.update()
其負責使精靈行為生效。
-
Sprite.add()
添加精靈到 groups 中。
-
Sprite.remove()
從精靈組 groups 中刪除。
-
Sprite.kill()
從精靈組 groups 中刪除全部精靈。
-
Sprite.alive()
判斷某個精靈是否屬於精靈組 groups 。
3. 建立精靈
所有精靈在建立時都是從 pygame.sprite.Sprite 中繼承的,建立精靈要設計自己的精靈類。
例——建立 Tank 精靈,代碼如下:
import pygame
class Tank(pygame.sprite.Sprite):
def __init__(self, image, initial_position):
self.image = pygame.image.load(image)
self.rect = self.image.get_rect()
self.rect.topleft = initial_position
if __name__ = '__main__':
pygame.init()
screen = pygame.display.set_mode((640, 480))
screen.fill((255, 255, 255))
filename = "../images/tank.png"
init_pos = (150, 100)
tank = Tank(filename, init_pos)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
screen.blit(tank.image, tank.rect)
pygame.display.update()
運行結果如下:

4. 建立精靈組
當程序中有大量實體的時候,操縱這些實體將會是一件相當麻煩的事,而精靈組可以作為一個實體精靈容器將這些精靈放在一起統一管理。
pygame 使用精靈組來管理精靈的繪制和更新,精靈組是一個簡單的容器。
使用 pygame.sprite.Group()
可以創建一個精靈組:
group = pygame.sprite.Group()
group.add(sprite_one)
精靈組也有 update() 和 draw() 函數:
group.update()
group.draw()
pygame 還提供了精靈與精靈之間的沖突檢測、精靈和組之間的沖突檢測。
5. 精靈與精靈之間的碰撞檢測
1. 兩個精靈之間的矩形檢測
在只有兩個精靈的時候可以使用 pygame.sprite.collide_rect()
函數進行一對一的沖突檢測。這個函數需要傳遞兩個精靈,並且兩個精靈都需要繼承自 pygame.sprite.Sprite 。
這里舉個例子:
sprite1 = Tank("sprite1.png", (150, 100)) # Tank 是上面3中例子創建的類。
sprite2 = Tank("sprite2.png", (120, 80))
result = pygame.sprite.collide_rect(sprite1, sprite2)
if result:
print("精靈碰撞了!")
2. 兩個精靈之間的圓檢測
矩形沖突檢測並不適合所有形狀的精靈,因此在 pygame 中還提供了圓形沖突檢測。pygame.sprite.collide_circle()
函數是基於每個精靈的半徑值來檢測的,用戶可以自己指定精靈半徑,或者讓函數計算精靈半徑。
result = pygame.sprite.collide_circle(sprite1, sprite2)
if result:
print("精靈碰撞了!")
3. 兩個精靈之間的像素遮罩檢測
如果矩形檢測和圓形檢測都不能滿足要求,pygame 還為用戶提供了一個更加精確的檢測——pygame.sprite.collide_mask()
。
這個函數接受精靈作為參數,返回值是一個 bool 變量。
if pygame.sprite.collide_mask(sprite1, sprite2):
print("精靈碰撞了!")
4. 精靈和精靈組之間的矩形沖突檢測
在調用 pygame.sprite.spritecollide(sprite, sprite_group, bool)
函數的時候,一個組中所有的精靈都會逐個地對另外一個單個精靈進行沖突檢測,發生沖突的精靈會作為一個列表返回。
這個函數的第1個參數是單個精靈,第2個參數是精靈組,第3個參數是一個 bool 值,最后這個參數起了很大的作用,當為 True 的時候會刪除組中所有沖突的精靈,當為 False 的時候不會刪除沖突的精靈。
list_collide = pygame.sprite.spritecollide(sprite, sprite_group, False)
另外,這個函數還有一個變體——pygame.sprite.spritecollideany()
,這個函數在判斷精靈組和單個精靈沖突的時候會返回一個 bool 值。
5. 精靈組之間的矩形沖突檢測
利用 pygame.sprite.groupcollide()
函數可以檢測兩個組之間的沖突,它返回一個字典(鍵值對)。