1. 程式人生 > 其它 >10.pygame-碰撞檢測

10.pygame-碰撞檢測

新增並監聽英雄發射子彈事件
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() # 遊戲結束