2015/11/7用Python寫遊戲,pygame入門(7):碰撞檢測

咱們已經完成了飛機大戰的大部分東西,可是遊戲仍是沒有辦法正式開玩,由於子彈並不能打掉飛機。只有完成了這一個工做,遊戲纔算基本成型。框架

今天的內容就很是簡單了,就是作到這個碰撞檢測,以及控制好子彈和飛機的消失。pygame裏的sprite模塊裏有碰撞檢測部分,可是,咱們這裏本身動手實現一個碰撞檢測的函數。函數


 

檢測碰撞的方法很簡單,就是子彈的位置在飛機圖片的內部。因爲子彈和飛機的速度比較快,因此不須要很是精確地判別。動畫

咱們認爲,若是子彈的座標(b.x, b.y)在飛機的圖片範圍內,也就是(e.x, e,y)到(e.x + e.width, e.y + e.height)這個矩形範圍內就行。(這裏須要回憶一下,咱們的子彈的座標是子彈圖片的中心,敵機的座標是它圖片左上角的座標)spa

因此,碰撞就是檢測:code

e.x < b.x < e.x + e.width對象

e.y < b.y < b.y + b.heightblog

若是子彈肯定已經達到了敵機,要作的事就是讓子彈重置,也讓飛機重置。遊戲

代碼實現就是這樣一個函數:圖片

def checkHit(enemy,bullet):
    if enemy.x < bullet.x < enemy.x + enemy.image.get_width() \
       and enemy.y < bullet.y < enemy.y + enemy.image.get_height():
        enemy.active = False
        bullet.active = False
        return True
    else:
        return False

這個函數能夠用來檢測碰撞,而後咱們在原來的主循環裏的代碼段更改爲這樣:get

for b in bullet:
        if b.active:
            b.move(time_passed_second)#移動子彈
            for e in enemy:
                if e.active:
                    checkHit(e,b)
            screen.blit(b.image, (b.x, b.y))#顯示子彈

而後運行你的代碼,你就能夠看到。子彈可以打掉飛機了。固然,大家都發現了。這個效果很突兀。以後,我會在上面加上動畫顯示效果,整個圖像會不那麼突兀。


 

如今子彈可以打掉敵機了,可是敵機沒辦法碰撞掉本身的飛機,咱們能夠再寫一個敵機和本身飛機的碰撞檢測。

這裏的碰撞檢測,咱們用另一種方法來檢測:

咱們經過兩點之間的距離小於必定值之後,就認爲是碰撞了。求距離用了兩點間距離公式,這裏不用複習了吧。

def checkCrash(enemy):
    plane_x, plane_y = pygame.mouse.get_pos()
    enemy_x, enemy_y = enemy.x, enemy.y
    enemy_x += enemy.image.get_width()/2
    enemy_y += enemy.image.get_height()/2
    distance = sqrt(float(plane_x - enemy_x)**2 + float(plane_y - enemy_y)**2)
    if distance < 75:
        return True
    else:
        return False

這裏用了sqrt()開平方,因此要在前面加一句from math import sqrt

這種方法,對於連個圓形的對象比較碰撞,至關好用,可是對於咱們的飛機形狀仍是表現稍差,具體用什麼方法,你們本身能夠考慮。


 

如今咱們完成的大部分的東西,既能夠打飛機又能夠被飛機撞毀。而後咱們應該加一些內容讓它顯得更豐富。好比說一個記分的模塊,好比說遊戲結束後顯示結束,選擇再來一次的模塊。

這些東西,今天就暫不往下講了,你們能夠本身實現,明天我給大概的框架。

因爲程序已經比較長了,就不發上來了。等差很少寫完功能再發吧。

相關文章
相關標籤/搜索