【嘮叨】
本節來講講簡單的物理碰撞檢測(非box2d物理碰撞):矩形、圓之間的碰撞檢測。
【3.x】
將數學類ccpoint、ccrect改為v3.x版本的vec2、rect就好了。
【簡單碰撞檢測】
在一些遊戲中經常會遇到碰撞檢測的情況,如憤怒的小鳥飛出去後,是否與石頭發生碰撞。
雖然說有乙個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 改為 ...