天天看點

轉載:python中的pygame編寫飛機大戰(六) 碰撞檢查

作者:還在琢磨 

來源:CSDN 

原文:https://blog.csdn.net/mbl114/article/details/78075821 

版權聲明:本文為部落客原創文章,轉載請附上博文連結

當英雄飛機發射的子彈擊中敵人的飛機,那麼敵人飛機和子彈都應該馬上消失。根據我們的設計,子彈隻需要設定visible屬性為False即可,而敵人飛機隻需要重新設定下初始位置,飛行速度即可。

我們子彈和飛機都維護了一個矩形,rect(x, y, width, height), 其中x和y是矩形在視窗上的坐标,碰撞檢測我們隻需要循環周遊每一顆已經發射的子彈,也就是visible為True的子彈和每一個敵人飛機的矩形是否相交,如果相交,說明子彈擊中了敵機,我們對應做行為就可以了。

我們現在在GameScene類的detect_conlision函數内做矩形是否相交的檢測,這裡我們還是比較簡單,我們隻判斷子彈是否和敵人飛機相交,至于英雄飛機和敵人飛機是否相撞,實作思路一樣,請大家自行嘗試。

--------------------- 

# 碰撞檢測
    def detect_conlision(self):
        # 檢測英雄子彈是否和敵機碰撞
        for bullet in self.hero.bullets:
            # 如果子彈不可見,說明子彈處于閑置狀态,直接continue
            if not bullet.visible:
                continue
            for enemy in self.enemy_list:
                # 判斷子彈的矩形和飛機的矩形是否相交
                if pygame.Rect.colliderect(bullet.rect, enemy.rect):
                    # 子彈設定為不可見
                    bullet.visible = False
                    # 敵人飛機重新設定位置和速度
                    enemy.set_pos(random.randint(0, self.size[1] - enemy.rect[2] - 20), 0)
                    enemy.speed = random.randint(2, 5)
                    break
           

這個似乎不難,打飛機就是 打敵人飛機,不讓敵人的飛機打我們,所有原作者沒有給出 敵人飛機打我們的代碼,可以讓我們體驗英雄的無敵樂趣。

我還是老實點,讓英雄也能中彈,但死不了,隻是輸出一個 結果。

#檢查敵人子彈是否和英雄相碰,列出所有的敵人,可以優化下,可見的子彈才碰
        for enemy in self.enemy_list:
            #找到所有子彈
            for bullet in enemy.bullets:
                #碰撞
                if (pygame.Rect.colliderect(bullet.rect, self.hero.rect) 
                      or pygame.Rect.colliderect(enemy.rect,self.hero.rect)):
                # 從預先建立完畢的爆炸中取出一個爆炸對象
                # 下面的代碼後面的文章 爆炸效果
                    for bomb in self.bombs:
                        if not bomb.visible:
                            # 爆炸對象設定爆炸位置
                            bomb.set_pos(self.hero.rect[0], self.hero.rect[1])
                            # 爆炸對象狀态設定為True
                            bomb.visible = True
                            bullet.visible = False
                            print('hero dead')
           

繼續閱讀