作者:還在琢磨
來源: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')