2D遊戲中的碰撞檢測

2021-07-26 07:07:44 字數 1608 閱讀 5431

近期做了乙個類似坦克大戰的android遊戲。關於碰撞檢測有一些收穫,記錄一下。

開始的思路是,將遊戲分成行列組成的小塊,當玩家或者怪物移動到某塊時,就將此小塊的id改為玩家或者怪物的id,子彈和怪物的碰撞,也是同樣處理。但是這樣造成的問題就是,每次玩家和怪物都必須行走乙個整格仔。玩家的移動,看起來有跳動感。

後來,我將玩家和普通障礙的碰撞和玩家與怪的碰撞分開處理。我原本是將玩家的的左上角作為玩家的座標,這樣並不合理,檢測碰撞時

一。玩家與環境

問題:給定兩個矩形a和b,矩形a的左上角座標為(xa1,ya1),右下角座標為(xa2,ya2),矩形b的左上角座標為(xb1,yb1),右下角座標為(xb2,yb2)。

(1)設計乙個演算法,確定兩個矩形是否相交(即有重疊區域)

(2)如果兩個矩形相交,設計乙個演算法,求出相交的區域矩形

(1)對於這個問題,一般的思路就是判斷乙個矩形的四個頂點是否在另乙個矩形的區域內。這個思路最簡單,但是效率不高,並且存在錯誤,錯誤在**,下面分析一下。

如上圖,把矩形的相交(區域重疊)分成三種(可能也有其他劃分),對於第三種情況,如圖中的(3),兩個矩形相交,但並不存在乙個矩形的頂點在另乙個矩形內部。所以那種思路存在乙個錯誤,對於這種情況的相交則檢查不出。

仔細觀察上圖,想到另一種思路,那就是判斷兩個矩形的中心座標的水平和垂直距離,只要這兩個值滿足某種條件就可以相交。

矩形a的寬 wa = xa2-xa1 高 ha = ya2-ya1

矩形b的寬 wb = xb2-xb1 高 hb = yb2-yb1

矩形a的中心座標 (xa3,ya3) = ( (xa2+xa1)/2 ,(ya2+ya1)/2 )

矩形b的中心座標 (xb3,yb3) = ( (xb2+xb1)/2 ,(yb2+yb1)/2 )

所以只要同時滿足下面兩個式子,就可以說明兩個矩形相交。

1) | xb3-xa3 | <= wa/2 + wb/2

2) | yb3-ya3 | <= ha/2 + hb/2

即:| xb2+xb1-xa2-xa1 | <= xa2-xa1 + xb2-xb1

| yb2+yb1-ya2-ya1 | <=y a2-ya1 + yb2-yb1

(2) 對於這個問題,假設兩個矩形相交,設相交之後的矩形(?也可能是平行四邊形,但是也滿足這種情況)為c,且矩形c的左上角座標為(xc1,yc1),右下角座標為(xc2,yc2),經過觀察上圖,很顯然可以得到:

xc1 = max(xa1,xb1)

yc1 = max(ya1,yb1)

xc2 = min(xa2,xb2)

yc2 = min(ya2,yb2)

這樣就求出了矩形的相交區域。

另外,注意到在不假設矩形相交的前提下,定義(xc1,yc1),(xc2,yc2),且xc1,yc1,xc2,yc2的值由上面四個式子得出。這樣,可以依據xc1,yc1,xc2,yc2的值來判斷矩形相交。

xc1,yc1,xc2,yc2只要同時滿足下面兩個式子,就可以說明兩個矩形相交。

3) xc1 <= xc2

4) yc1 <= yc2

即:max(xa1,xb1) <= min(xa2,xb2)

max(ya1,yb1) <= min(ya2,yb2)

遊戲中的碰撞檢測

遊戲中的碰撞檢測方式有很多,不同的演算法之間主要是在精度和速度之間權衡。以下幾種方式按照速度排序說明。以2d為例,3d不過是增加了一維罷了,演算法理解上沒太大區別。一 地圖格仔劃分檢測 最簡單的一種檢測,就是把地圖 或者稱為場景,總之是指碰撞發生的範圍 劃成乙個個格仔,類似仙劍奇俠傳這樣。假設地圖有...

遊戲中的碰撞檢測

遊戲中的碰撞檢測方式有很多,不同的演算法之間主要是在精度和速度之間權衡。以下幾種方式按照速度排序說明。以2d為例,3d不過是增加了一維罷了,演算法理解上沒太大區別。一 地圖格仔劃分檢測 最簡單的一種檢測,就是把地圖 或者稱為場景,總之是指碰撞發生的範圍 劃成乙個個格仔,類似仙劍奇俠傳這樣。假設地圖有...

遊戲中的碰撞檢測

遊戲中的碰撞檢測方式有很多,不同的演算法之間主要是在精度和速度之間權衡。以下幾種方式按照速度排序說明。以2d為例,3d不過是增加了一維罷了,演算法理解上沒太大區別。一 地圖格仔劃分檢測 最簡單的一種檢測,就是把地圖 或者稱為場景,總之是指碰撞發生的範圍 劃成乙個個格仔,類似仙劍奇俠傳這樣。假設地圖有...