Pygame如何使用精靈和碰撞檢測
在開始學習相關知識點之前,我們有必要先學習精靈和碰撞檢測的含義。
精靈(英文譯為 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() | 兩個精靈之間的矩形檢測,即矩形區域是否有交匯,返回一個佈爾值。 |
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() # 繪制精靈到屏幕上 screen.blit(snake1.image,snake1.rect) screen.blit(snake2.image,snake2.rect) # 刷新顯示屏幕 pygame.display.update()
當精靈沒有發生碰撞時,程序的運行結果如下:
圖2:運行結果
接下來,我們將 snake2 的location_2參數變為 (100,140),然後再次運行程序,這時兩個精靈就會發生碰撞,運行結果如下:
圖3:運行結果
除上述內容外,Pygame 還提供許多其他模塊,比如 mixer(聲音)、movie(播放視頻)、music(播放音頻)、sndarray(操作聲音數據)等模塊,由於這些模塊使用起來較為簡單,因此這裡不再逐一介紹,感興趣的朋友可以閱讀 Pygame 官方文檔 —>點擊前往!
到此這篇關於Pygame如何使用精靈和碰撞檢測的文章就介紹到這瞭,更多相關Pygame 精靈和碰撞檢測內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Pygame鼠標進行圖片的移動與縮放案例詳解
- Pygame庫200行代碼實現簡易飛機大戰
- Python Pygame中精靈和碰撞檢測詳解
- Python+Pygame實戰之實現小蜜蜂歷險記遊戲
- Python+Pygame實現趣味足球遊戲