Pygame如何使用精靈和碰撞檢測

2022-09-24 10:54:08 字數 3186 閱讀 3944

在開始學習相關知識點之前,我們有必要先學習精靈和碰撞檢測的含義。

精靈(英文譯為 sprite),其實在乙個遊戲程式中,精靈本質指的是一張張小尺寸的,比如遊戲中的各種道具、人物、場景程式設計客棧裝飾等,它們都可以看做成一張張小的「精靈」圖。除此之外,人物的移動也可以看做是一系列小精靈圖構成的序列(按幀組成的序列),如下圖所示:

圖1:動作逐幀分解圖

如果將逐幀分解後的動作,按照一定的頻率**,那麼就形成了動畫精靈,您將會看到雄鷹展翅高飛、人在策馬奔騰、運動員奮力跳遠。

精靈有個特點就是允許精靈之間進行互動,也稱之為碰撞,而碰撞檢測,指的就是檢測兩個精靈之間是否發生了碰撞。比如在貪吃蛇遊戲中蛇的頭部是否與食物發生了碰撞,或者飛機大戰遊戲中子彈是否擊中了外星人等等。當檢測到碰撞發生後,接下來會觸發某些事件,比如子彈擊中外星人,外星人就會消失,玩家的得分也會隨之增加,並且在遊戲螢幕上又會出現乙個外星人。

pygame 專門提供了乙個處理精靈的模組,也就是 sprite(pygame.sprite)模組。通常情況下,我們使用該模組的基類 sprite 來建立乙個子類,從而達到處理精靈的目的,該子類提供了操作精靈的常用屬性和方法,如下所示:

屬性&方法

說明self.image

載入要顯示的精靈,控制大小和填充色

self.rect

精靈顯示在哪個位置

sprite.update()

重新整理精靈圖,使其相應效果生效

sprite.add()

新增精靈圖到精靈組中(groups)

sprite.remove()

從精靈組中刪除選中的精靈圖

sprite.kill()

刪除精靈組中全部的精靈

sprite.alive()

判斷某個精靈是否屬於精靈組

注意,當遊戲中有大量的精靈時,操作它們將變得複雜,此時通過構建精靈容器(group 類)也就是精靈組來統一管理這些精靈。構建方法如下:

# 建立精靈組

group = pygame.sprite.group()

# 向組內新增乙個精靈

group.add(sprite_one)

於此同時pygame.sprite模組也提供了多種檢測精靈是否碰撞的方法,如下所示:

方法說明

程式設計客棧

pygame.sprite.collide_rect() 

兩個精靈之間的矩形檢測,即矩形區域是否有交匯,返回乙個布林值。

www.cppcns.com pygame.sprite.collide_circle()

兩個精靈之間的圓形檢測,即圓形區域是否有交匯,返回乙個布林值。

pygame.sprite.collide_mask() 

兩個精靈之間的畫素蒙版檢測,更為精準的一種檢測方式。

pygame.sprite.spritecollide() 

精靈和精靈組之間的矩形碰撞檢測,乙個組內的所有精靈會逐一地對另外乙個單個精靈進行碰撞檢測,返回值是乙個列表,包含了發生碰撞的所有精靈。

pygame.sprite.spritecollideany()

精靈和精靈組之間的矩形碰撞檢測,上述函式的變體,當發生碰撞時,返回組內的乙個精靈,無碰撞發生時,返回 none。

pygame.sprite.groupcollide()

檢測在兩個組之間發生碰撞的所有精靈,它返回值是乙個字典,將第一組中發生碰撞的精靈作為鍵,第二個組中發生碰撞的精靈作為值。

下面看一組簡單的示例,**如下所示:

import pygame

class snake(pygame.sprite.sprite):

#定義建構函式

def __init__(self,filename,location):

# 調父類來初始化子類

pygame.sprite.sprite.__init__(self)

# 載入

self.image = pygame.image.load(filename)

# 獲取rect區域

self.rect = self.image.get_rect()

# 設定位置

self.rect.topleft=location

# 初始化pygame

pygame.init()

screen = pygame.display.set_mode((500,400))

pygame.display.set_caption('c語言中文網')

# 填充為白色螢幕

screen.fill((255,255,255))

filename ="c:/users/administrator/desktop/snake.png"

location =(100,150)

snake1 = snake(filename,location)

# 碰撞檢測,必須有兩個精靈,因此再建立乙個精靈,並使用location來控制第二個精靈的位置

location_2 = (100,80)

snake2 = snake('c:/users/administrator/desktop/logo.png',location_2)

# 呼叫 collide_rect()進行矩形區域檢測,返回乙個布林值,碰撞返回true,否則返回false

crash_result = pygame.sprite.collide_rect(snake1,snake2)

if crash_result:

print("精靈碰撞了!")

pass

else:

print('精靈沒碰撞')

while true:

for event in pygame.event.get():

if event.type == pygame.quit:

pygame.quit()

exit()

# 繪製精靈到螢幕上

scrkheoeeen.blit(snake1.image,snake1.rect)

screen.blit(snake2.image,snake2.rect)

# 重新整理顯示螢幕

pygame.display.update()

當精靈沒有發生碰撞時,程式的執行結果如下:

圖2:執行結果

接下來,我們將 snake2 的location_2引數變為 (100,140),然後再次執行程式,這時兩個精靈就會發生碰撞,執行結果如下:

圖3:執行結果

Pygame精靈和精靈組

pygame 提供了兩個類 pygame.sprite.sprite 儲存 影象資料 image 和 位置 rect 的 物件 pygame.sprite.group 精靈在遊戲開發中,通常把 顯示影象的物件 叫做精靈 sprite 精靈 需要 有 兩個重要的屬性 image 要顯示的影象 rect...

python使用pygame建立精靈Sprite

精靈組可以對其中的所有精靈呼叫它們各自的更新方法 s程式設計客棧elf.update 來進行更新,如位置更新 碰撞檢測 衝突檢測等 all sprites.update 精靈組可以對其中的所有精靈呼叫它們各自的draw方法 self.update 來繪製精靈 all sprites.draw scr...

使用Python和pyGame進行虛擬儀器開發

說明 這是我2007年寫在cublog china unix 上的部落格,現在把它轉到這裡來.偶然發現pygame的高速繪圖效果,於是忽然想做乙個虛擬示波器,以前經常見到基於 visual c 的收費的類庫,感覺太複雜了,根本沒想過要自己寫乙個.然而使用python後,一切都變得很簡單了.當然,目前...