10.pygame-碰撞檢測
阿新 • • 發佈:2022-05-22
新增並監聽英雄發射子彈事件
class Hero(GameSprite): def __init__(self): # 呼叫父類方法,設定image super().__init__('./images/me1.png', 0) # 設定英雄的初始位置 self.rect.centerx = SCREEN_RECT.centerx self.rect.bottom = SCREEN_RECT.bottom - 120 # 建立子彈精靈組 self.bullets = pygame.sprite.Group() # 重寫父類方法,實現左右移動 def update(self): # 英雄在水平方向移動 self.rect.x += self.speed # 控制不能離開螢幕 # 判斷x 小於0 的時候,將x設為0 if self.rect.x < 0: self.rect.x = 0 # right = x + 視窗寬度 = 右側 elif self.rect.right > SCREEN_RECT.right: self.rect.right = SCREEN_RECT.right # 發射子彈 def fire(self): for i in (0, 1, 2): # 建立子彈精靈 bullet = Bullet() # 設定子彈精靈位置 bullet.rect.bottom = self.rect.y - i * 20 bullet.rect.centerx = self.rect.centerx # 新增精靈組 self.bullets.add(bullet)
# 英雄發射子彈事件,因為建立敵機已經用了,所以我們在基礎上+1
HREO_FIRE_EVENT = pygame.USEREVENT + 1
定義子彈類# 設定定時器事件 -- 發射子彈 pygame.time.set_timer(HREO_FIRE_EVENT,500) #監聽事件 elif event.type == HREO_FIRE_EVENT: #判斷是否發射子彈事件 self.hero.fire() #呼叫發射子彈方法 # 更新繪製發射子彈精靈組 self.hero.bullets.update() self.hero.bullets.draw(self.screen)
class Bullet(GameSprite):
def __init__(self):
# 設定子彈圖片和初始速度
super().__init__('./images/bullet1.png', -2)
def update(self):
# 呼叫父類方法,讓子彈垂直方向飛行
super().update()
# 判斷子彈是否飛出螢幕
if self.rect.bottom < 0:
self.kill()
碰撞檢測
兩個精靈組中所有精靈的碰撞檢測pygame.sprite.groupcollide(group1,gorup2,dokill1,dokill2,collided=None)
"""
如果將dokill設定為True,則發生碰撞的精靈將被自動移除
collided引數用於計算碰撞的回撥函式,如果沒有指定,則每個精靈必須有一個rect屬性
"""
# 私有方法-碰撞監測
def __check_collide(self):
#傳入子彈精靈組合敵機精靈組,任意發生碰撞則銷燬
pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)
某個精靈和指定精靈組中的精靈碰撞檢查
pygame.sprite.spritecollide(sprite,group,dokill,collided=None) -> Sprite_list
"""
如果dokill設定為True,則指定精靈組中發生碰撞的精靈自動移除
collided返回值是一個列表,是精靈組中和精靈發生碰撞的精靈
"""
# 敵機撞毀英雄
enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
# 判斷enemies是否有內容
if enemies:
#銷燬英雄飛機
self.hero.kill()
self.__game_over() # 遊戲結束