pygame 的精靈使用


轉載注明鏈接:https://www.cnblogs.com/liquancai/p/13256388.html

pygame 的精靈使用

pygame.sprite.Sprite 是 pygame 中用來實現精靈的一個類,在使用時並不需要對它實例化,只需要繼承它,然后按需寫出自己的類,因此非常簡單、使用。


1. 精靈

精靈可以被認為是一個個小圖片(幀)序列(例如人物行走),它可以在屏幕上移動,並且可以與其他圖形對象交互。精靈圖像可以是用 pygame 繪制形狀函數繪制的形狀,也可以是圖像文件。


2. Sprite 類的成員

pygame.sprite.Sprite 用來實現精靈類,Sprite 的數據成員和函數方法主要如下。

  1. 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 大小的矩形填充紅
    
  2. 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 分別表示上、下、左、右。

  3. self.update()

    其負責使精靈行為生效。

  4. Sprite.add()

    添加精靈到 groups 中。

  5. Sprite.remove()

    從精靈組 groups 中刪除。

  6. Sprite.kill()

    從精靈組 groups 中刪除全部精靈。

  7. 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() 函數可以檢測兩個組之間的沖突,它返回一個字典(鍵值對)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM