1. 程式人生 > >遊戲中的碰撞(一)

遊戲中的碰撞(一)

對於一個遊戲物件來說,有他自己的精靈和碰撞盒,一般來說,碰撞盒有矩形,圓形和精確型,當然你也可以任性的把一個碰撞盒做成不規則的。

那麼根據這些碰撞盒,就產生了多種碰撞方式,例如:矩形與矩形,矩形與圓形,矩形與精確型,矩形與不規則型的,圓形精確型的......

碰撞方式是如此之多,但是,因為效率和程式碼複雜度的問題,我們一般不採用精確碰撞,除非你用到的時候。

本篇首先研究矩形與矩形,圓形與圓形的碰撞:

(一)矩形與矩形的碰撞:

例如圖中的2個矩形,如果判斷他們2個是否碰撞,確實有點不好想,不過,我們可以反過來考慮他們2個不撞得情況,那麼就會有4種情況。

除了這4種不碰撞的情況,剩下的都是碰撞的情況.假設矩形1的左上角的座標為(x1,y1),橫向寬度為w1,縱向高度為h1,矩形2的左上角座標為(x2,y2),橫向寬度為w2,縱向高度為h2.同android,windows的螢幕座標系統一樣,我們假設左上角為原點(0,0),橫向向右為x軸正向,縱向為y軸正向。

那麼對於情況1:我們可以得到判定條件為x1+w1<x2

情況2:我們可以得到判定條件為x1>x2+w2

情況3:我們可以得到判定條件為y1+h1<y2

情況4:我們可以得到判定條件為y1>y2+h2

除了這4種情況外的都為碰撞,因此我們可以寫出函式程式碼:

<span style="font-size:12px;color:#000000;">bool collision(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2)
{
    if(x1+w1<x2)
        return false;
    else if(x1>x2+w2)
        return false;
    else if(y1+h1<y2)
        return false;
    else if(y1>y2+h2)
         return false;
     return true;
}</span>


(二)圓形與圓形的碰撞:

如果要判斷2個圓之間是否碰撞,只需要判斷2個圓的圓心距是否小於2圓的半徑之和,如果是,那麼這2圓發生了碰撞事件,我們假設圓形1的圓心座標是x1,y1,半徑是r1,圓形2的圓形座標是x2,y2,半徑是r2.座標系統依舊延續剛才矩形的座標系統.

那麼我們可以得出,sqrt(pow(x1-x2,2)+pow(y1-y2),2)<=r1+r2,那麼這2個圓就發生了碰撞.不過考慮到開平方的代價,我們可以稍作改變,比較他們的平方就可以了.

因此我們可以寫出程式碼:

bool collision(int x1,int y1,int r1,int x2,int y2,int r2)
{
    if(pow(x1-x2,2)+pow(y1-y2,2)<=pow(r1+r2,2))
        return true;
    return false;
}