項目詳細介紹
在這個系列中,將制作一個雷霆戰(zhàn)機游戲不皆。
碰撞發(fā)生了什么?
Pygame中的默認碰撞類型是使用collide_rect()
函數(shù),該函數(shù)使用兩個精靈的rect
屬性來計算它們是否重疊飘言。這稱為AABB碰撞,它非惩障溃快速和可靠姿鸿。但是,如果精靈圖像不是矩形倒源,那么就會出現(xiàn)如圖所示的情況苛预。矩形重疊,那么collide_rect()
就是True
笋熬,但是玩家會感到沮喪热某,因為他們覺得自己應(yīng)該已經(jīng)成功地躲過流星(還差點才碰到一起)。
如果發(fā)現(xiàn)處于這種情況胳螟,可以嘗試以下幾種方法:
通過使用collide_rect_ratio()
函數(shù)苫拍,您可以使用較小的矩形(上圖矩形的0.7倍),減少可以計為重疊的“空”空間量旺隙。根據(jù)精靈的形狀绒极,這可以很好地工作。這意味著在某些情況下蔬捷,流星似乎會通過機翼而不會被視為撞擊垄提。這實際上是一個很好的情況榔袋!當游戲中的事物發(fā)生變化時,玩家不會直接注意到這一點铡俐,只會覺得他們“躲開”了一個非常接近的閃避凰兑。他們不會感到沮喪,而是會覺得自己做得很好审丘。
另一種選擇是使用圓形邊界框吏够。在流星的情況下,這是非常合適的滩报。它不太適合飛船---在碰到飛船之外的機翼也不會算數(shù)锅知。
設(shè)置精靈的半徑
根據(jù)上面的選項,將為流星與玩家碰撞設(shè)置碰撞圈脓钾。Pygame讓這很容易實現(xiàn) - 只需要在每個sprite上設(shè)置一個新屬性:self.radius
售睹。
讓從玩家開始。碰撞圈應(yīng)該有多大可训?可以通過一些實驗來獲得正確的值昌妹。以下是如何在玩家精靈中執(zhí)行此操作__init()__
:
self.rect = self.image.get_rect()
self.radius = 25
pygame.draw.circle(self.image, RED, self.rect.center, self.radius)
在玩家圖像上繪制一個紅色圓圈,以便可以看到它的外觀握截。讓為流星做同樣的事情:
self.rect = self.image.get_rect()
self.radius = int(self.rect.width / 2)
pygame.draw.circle(self.image, RED, self.rect.center, self.radius)
玩家精靈的半徑可能太大了 - 它在y軸上實際上比船的大小更大飞崖。為了更接近,讓設(shè)置self.radius = 20
谨胞。
對于流星固歪,想要一些角落伸出來,所以讓將圓圈縮放到85%的大行笳!:
self.radius = int(self.rect.width * .85 / 2)
更改碰撞類型
為了讓游戲開始后使用這些圓圈進行碰撞測試,只需要更改spritecollide
命令以使用圓形函數(shù)而不是AABB:
# check to see if a mob hit the player
hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle)
if hits:
running = False