cocos2dx基礎篇 23 簡單碰撞檢測

2021-08-27 15:57:01 字數 2895 閱讀 1304

【嘮叨】

本節來講講簡單的物理碰撞檢測(非box2d物理碰撞):矩形、圓之間的碰撞檢測。

【3.x】

將數學類ccpointccrect改為v3.x版本的vec2rect就好了。

【簡單碰撞檢測】

在一些遊戲中經常會遇到碰撞檢測的情況,如憤怒的小鳥飛出去後,是否與石頭發生碰撞。

雖然說有乙個box2d物理碰撞引擎,但是在這裡還是需要掌握一下簡單的碰撞檢測方法。

(1)矩形與矩形

(2)圓與圓

(3)矩形與圓

1、矩形與矩形

1.1、提出問題

問題:假設有兩個矩形rect1,rect2,判斷兩矩是否碰撞相交(部分區域重疊)。

如下四幅圖中,圖1、2、4發生碰撞,圖3未發生碰撞。

1.2、解決方案

由圖可知,判斷方法只要計算一下兩個矩形相交部分是否能夠成乙個小矩形。

判斷方法如下:(可用於計算相交部分的小矩形資訊)

//

bool collision_rectwithrect(ccrect rect1, ccrect rect2)

//

當然也可以使用cocos2dx引擎中的ccrect類已經存在的乙個判斷矩形碰撞的函式。

//

//返回bool。相交為true

rect1.intersectsrect(rect2);//

// //intersectsrect()函式的原始碼如下:

bool ccrect::intersectsrect(const ccrect& rect) const

//

2、圓與圓2.1、提出問題問題:假設有兩個圓circle1,circle2,判斷兩圓是否碰撞相交(部分區域重疊)。

如下三幅圖中,圖1、2發生碰撞,圖3未發生碰撞。

2.2、解決方案

圓的碰撞檢測比較簡單,只要判斷兩圓心距離是否小於半徑相加(r1+r2)即可。

判斷方法如下:

//

bool collision_circlewithcircle(ccpoint p1, float r1, ccpoint p2, float r2)

//

3、矩形與圓3.1、提出問題問題:假設有矩形rect、圓circle,判斷矩形和圓是否碰撞相交(部分區域重疊)。

如下四幅圖中,圖1、2、4發生碰撞,圖3未發生碰撞。

3.2、解決方案

矩形和圓的判斷比較複雜,請看以下分析。

(1)首先,我們讓圓在矩形外沿著矩形的邊滾一圈,然後將圓心移動的軌跡連線,就可以得到乙個圓角矩形。

(2)如下圖紅色區域為圓角矩形,顯然我們只要判斷圓心是否在圓角矩形區域內部即可。

(3)如果除去圓角矩形四個角上的4個四分之一圓的部分,僅僅讓你判斷圓心是否落在剩下的區域內,你應該能很快想出解決辦法吧?

只要判斷圓心是否在兩個矩形的任意其中之一的內部即可。

(4)然後再判斷圓心是否在四個角上的四分之一圓的區域部分即可。

顯然,只要判斷圓心與矩形的四個頂點的距離是否小於圓的半徑即可。

(5)綜合上訴:(3)(4)的判斷,即可得出圓是否矩形相交。

判斷方法如下:

//

bool collision_rectwithcircle(ccrect rect, ccpoint p, float r)

//

cocos2dx基礎篇 27 螢幕適配

1 兩個解析度 1.1 視窗解析度 在main.cpp中有個設定視窗解析度的函式。該函式是設定了我們預想裝置的螢幕大小,也就是應用程式視窗的大小。eglview setframesize 480,320 1.2 設計解析度 可視區域 但是對於每個使用者來說,他們使用的裝置不一定是 480 320 的...

cocos2d x 觸控簡單分析

cclayer中的settouchenabled true 會開啟多點觸控。如果使用ccdirector shareddirector gettouchdispatcher addtargeteddelegate this,0,true 只會開啟乙個點的觸控。當helloworld cctouchb...

cocos2dx基礎篇 26 單例模式

單例模式,說的通俗一點就是 建立某個類的全域性唯一靜態例項物件。也就是說從它建立開始,一直到整個遊戲程式結束才會釋放資源,期間一直儲存的著資料。單例類在大部分遊戲中應該是必不可少的部分,如整個遊戲 的開關控制 資料的載入與儲存等都需要乙個全域性訪問點來控制,那就需要用到單例類了。shared 改為 ...