在開始學習相關知識點之前,我們有必要先學習精靈和碰撞檢測的含義。
精靈(英文譯為 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後,一切都變得很簡單了.當然,目前...