遊戲開發基礎 碰撞檢測

2021-07-25 06:39:40 字數 2276 閱讀 6761

碰撞就是遊戲中的元素是否碰到一起,比如***遊戲,沒躲避炮彈就算碰撞,要檢測出來,要game over的。主要講講2d遊戲裡的碰撞檢測,傳統的2d遊戲可以把不同元素當作基本圖形粗糙地來檢測碰撞與否?

1、矩形判斷 

比如把遊戲中敵我雙方人物都當作矩形來檢測兩個矩形是否相交。那麼如何判讀兩個矩形是否相交呢? 

相交 == !(不相交),不相交較好判斷,優先判讀不相交再取反就可以了。

如上圖旁邊矩形都不和中間矩形相交,它們都有共同特點:

1、旁邊矩形(b)的xy座標沒有同時介於中間矩形(a)x~x',y~y'間,即沒有乙個點出現在a矩形內部,用偽**判斷不相交就是

b.max(x)  a.max(x) || b.max(y) a.max(y)

那麼判讀相交的偽**就是

!(b.max(x)  a.max(x) || b.max(y) a.max(y))

2、當然由於矩形的特殊性,當知道矩形左上角的座標和寬高時就可以知道其他三點的座標,而且左上角座標一般也是我們繪製矩形要傳遞的引數。

設兩個矩形(a,b)座標寬高為x1,y1,w1,h1和x2,y2,w2,h2,判斷不相交**就是:

1

/**2

* 判斷兩矩形是否相交3*/

4public

boolean iscollsionwithrect(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int

h2) else

if (x1 <= x2 && x1 + w1 <=x2) else

if (y1 >= y2 && y1 >= y2 +h2) else

if (y1 <= y2 && y1 + h1 <=y2)

18//

不相交都不滿足,那就是相交了

19return

true

;20 }

2、圓形判斷

圓形判讀比較簡單,即判斷兩個圓心距離是否大於兩個圓的半徑之和

* 圓形碰撞3*

@param

x1 圓形1的圓心x座標4*

@param

y1 圓形2的圓心x座標5*

@param

x2 圓形1的圓心y座標6*

@param

y2 圓形2的圓心y座標7*

@param

r1 圓形1的半徑8*

@param

r2 圓形2的半徑9*

@return

10*/

11private

boolean iscollisionwithcircle(int x1, int y1, int x2, int y2, int r1, int

r2)

18return

false

;19 }

3、多矩形判斷

這時我們就要封裝多個矩形來一一判斷是否有碰撞。

1

//rect 類中的四個屬性 top bottom left right2//

分別表示這個矩形的 上 下 左 右

3public

boolean

iscollsionwithrect(rect rectarray, rect rect2array) else

if (x1 <= x2 && x1 + w1 <=x2) else

if (y1 >= y2 && y1 >= y2 +h2) else

if (y1 <= y2 && y1 + h1 <=y2) else31}

32}33return

false

;34 }

*****===個人**: 文章很多是上面搬過來的,以後都在個人**上更新,有興趣的可以移步☺*****===

碰撞檢測 膠囊體碰撞檢測

膠囊體 給定一條線段l,所有道l的距離為r的點的集合。由定義可知,膠囊體由半徑r和線段l標識。檢測兩個膠囊體是否發生碰撞,即檢測兩條線段l1 l2的最短距離d是否大於l1 l2的半徑r1 r2之和,d r1 r2 則未碰撞,否則發生碰撞。設線段l1端點為a1 a2,線段l2端點為b1 b2,號表示兩...

遊戲中的碰撞檢測

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

遊戲中的碰撞檢測

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