国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-14 16:55:27
字體:
來源:轉載
供稿:網友

我們已經完成了飛機大戰的大部分東西,但是游戲還是沒有辦法正式開玩,因為子彈并不能打掉飛機。只有完成了這一個工作,游戲才算基本成型。

今天的內容就非常簡單了,就是做到這個碰撞檢測,以及控制好子彈和飛機的消失。pygame里的sPRite模塊里有碰撞檢測部分,但是,我們這里自己動手實現一個碰撞檢測的函數。


 

檢測碰撞的方法很簡單,就是子彈的位置在飛機圖片的內部。由于子彈和飛機的速度比較快,所以不需要非常精確地判別。

我們認為,如果子彈的坐標(b.x, b.y)在飛機的圖片范圍內,也就是(e.x, e,y)到(e.x + e.width, e.y + e.height)這個矩形范圍內就行。(這里需要回憶一下,我們的子彈的坐標是子彈圖片的中心,敵機的坐標是它圖片左上角的坐標)

所以,碰撞就是檢測:

e.x < b.x < e.x + e.width

e.y < b.y < b.y + b.height

如果子彈確定已經達到了敵機,要做的事就是讓子彈重置,也讓飛機重置。

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

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

這個函數可以用來檢測碰撞,然后我們在原來的主循環里的代碼段更改成這樣:

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

這種方法,對于連個圓形的對象比較碰撞,相當好用,但是對于我們的飛機形狀還是表現稍差,具體用什么方法,大家自己可以考慮。


 

現在我們完成的大部分的東西,既可以打飛機又可以被飛機撞毀。然后我們應該加一些內容讓它顯得更豐富。比如說一個記分的模塊,比如說游戲結束后顯示結束,選擇再來一次的模塊。

這些東西,今天就暫不往下講了,大家可以自己實現,明天我給大概的框架。

由于程序已經比較長了,就不發上來了。等差不多寫完功能再發吧。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马尔康县| 南皮县| 绍兴县| 淮北市| 锡林郭勒盟| 南汇区| 西乌珠穆沁旗| 全椒县| 东明县| 龙里县| 博爱县| 东至县| 如东县| 新化县| 建瓯市| 金溪县| 阳春市| 仁寿县| 临江市| 垫江县| 雷州市| 鲁山县| 上饶县| 文安县| 云安县| 扶余县| 平昌县| 靖远县| 天水市| 新郑市| 忻城县| 五峰| 隆回县| 正宁县| 顺义区| 灵石县| 乳源| 定陶县| 修水县| 西贡区| 太白县|