碰撞檢測(cè)算法在Java ME中的實(shí)現(xiàn)
在Java ME游戲開發(fā)中,經(jīng)常需要進(jìn)行碰撞檢測(cè)算法的實(shí)現(xiàn),例如判斷前面是否有障礙以及判斷子彈是否擊中飛機(jī),都是檢測(cè)兩個(gè)物體是否發(fā)生碰撞,然后根據(jù)檢測(cè)的結(jié)果通過碰撞檢測(cè)算法做出不同的處理。
進(jìn)行碰撞檢測(cè)算法的物體可能有些的形狀和復(fù)雜,這些需要進(jìn)行組合碰撞檢測(cè),就是將復(fù)雜的物體處理成一個(gè)一個(gè)的基本形狀的組合,然后分別進(jìn)行不同的檢測(cè)。
下面簡(jiǎn)單介紹一下兩種最基本的形狀進(jìn)行碰撞的時(shí)候進(jìn)行的處理。
1、矩形和矩形進(jìn)行碰撞檢測(cè)算法
一般規(guī)則的物體碰撞都可以處理成矩形碰撞,實(shí)現(xiàn)的原理就是檢測(cè)兩個(gè)矩形是否重疊。我們假設(shè)矩形1的參數(shù)是:左上角的坐標(biāo)是(x1,y1),寬度是w1,高度是h1;矩形2的參數(shù)是:左上角的坐標(biāo)是(x2,y2),寬度是w2,高度是h2。
在檢測(cè)時(shí),數(shù)學(xué)上可以處理成比較中心點(diǎn)的坐標(biāo)在x和y方向上的距離和寬度的關(guān)系。即兩個(gè)矩形中心點(diǎn)在x方向的距離的絕對(duì)值小于等于矩形寬度和的二分之一,同時(shí)y方向的距離的絕對(duì)值小于等于矩形高度和的二分之一。下面是數(shù)學(xué)表達(dá)式:
x方向:| (x1 + w1 / 2) – (x2 + w2/2) | < |(w1 + w2) / 2|
y方向:| (y1 + h1 / 2) – (y2 + h2/2) | < |(h1 + h2) / 2|
在Java ME程序中,只需要將上面的條件轉(zhuǎn)換成代碼就可以實(shí)現(xiàn)了。
但是矩形碰撞只是一種比較粗糙的碰撞檢測(cè)算法,因?yàn)楹芏鄬?shí)際的物體可能不是一個(gè)規(guī)則的矩形。
下面介紹一下圓形碰撞。
2、圓形和圓形的碰撞檢測(cè)算法
圓形和圓形的碰撞應(yīng)該說是一種最簡(jiǎn)單的碰撞,因?yàn)樵跀?shù)學(xué)上對(duì)于兩個(gè)圓形是否發(fā)生重疊,有計(jì)算兩個(gè)圓心之間的距離的公式。那么條件就變?yōu)椋河?jì)算兩個(gè)圓心之間的距離是否小于兩個(gè)圓的半徑和。
假設(shè)圓形1的左上角坐標(biāo)是(x1,y1),半徑是r1,圓形2的左上角的坐標(biāo)是(x2,y2),半徑是r2。
因?yàn)镸IDP1.0中沒有浮點(diǎn)數(shù),而且浮點(diǎn)數(shù)的運(yùn)算比較慢,所以我們將條件做一個(gè)簡(jiǎn)單的變換:對(duì)于條件的兩邊都進(jìn)行平方,這樣就去掉了開方的運(yùn)算步驟。
下面是數(shù)學(xué)表達(dá)式:
(x1 – x2)2 + (y1 – y2)2 < (r1 + r2)2
在Java ME程序中,只需要將上面的條件轉(zhuǎn)換成代碼就可以了。
上面介紹的只是最基本的碰撞檢測(cè)算法的實(shí)現(xiàn),而實(shí)際的編程過程中遇到的碰撞檢測(cè)問題要比這些復(fù)雜很多,還需要其他形式的檢測(cè),還需要進(jìn)行更加深入的學(xué)習(xí)。
【編輯推薦】