cocos2dx[2.x](22)--簡單碰撞檢測
【嘮叨】
本節來講講簡單的物理碰撞檢測(非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)
{
//計算相交部分的矩形
//左下角座標:( lx , ly )
//右上角座標:( rx , ry )
float lx = max(rect1.getMinX() , rect2.getMinX() );
float ly = max(rect1.getMinY() , rect2.getMinY() );
float rx = min(rect1.getMaxX() , rect2.getMaxX() );
float ry = min(rect1.getMaxY() , rect2.getMaxY() );
//判斷是否能構成小矩形
if( lx > rx || ly > ry ) return false; //矩形不相交
else return true; //發生碰撞
}
當然也可以使用cocos2dx引擎中的CCRect類已經存在的一個判斷矩形碰撞的函式。
//返回bool。相交為true
rect1.intersectsRect(rect2);
//intersectsRect()函式的原始碼如下:
bool CCRect::intersectsRect(const CCRect& rect) const
{
return !( getMaxX() < rect.getMinX() ||
rect.getMaxX() < getMinX() ||
getMaxY() < rect.getMinY() ||
rect.getMaxY() < getMinY());
}
2、圓與圓
2.1、提出問題
問題:假設有兩個圓circle1,circle2,判斷兩圓是否碰撞相交(部分割槽域重疊)。
如下三幅圖中,圖1、2發生碰撞,圖3未發生碰撞。
2.2、解決方案
圓的碰撞檢測比較簡單,只要判斷兩圓心距離是否小於半徑相加(r1+r2)即可。
判斷方法如下:
bool collision_CircleWithCircle(CCPoint p1, float r1, CCPoint p2, float r2)
{
//計算圓心距離
float dist = p1.getDistance(p2);
//判斷兩圓是否相交
return dist < (r1+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)
{
//獲取矩形資訊
//左下角座標:( lx , ly )
//右上角座標:( rx , ry )
float lx = rect.getMinX();
float ly = rect.getMinY();
float rx = rect.getMaxX();
float ry = rect.getMaxY();
//計算圓心到四個頂點的距離
float d1 = p.getDistance( ccp(lx, ly) );
float d2 = p.getDistance( ccp(lx, ry) );
float d3 = p.getDistance( ccp(rx, ly) );
float d4 = p.getDistance( ccp(rx, ry) );
//判斷是否碰撞
//判斷距離是否小於半徑
if( d1<r || d2<r || d3<r || d4<r ) return true;
//是否在圓角矩形的,橫向矩形內
if( p.x > (lx-r) && p.x < (rx+r) && p.y > ly && p.y < ry ) return true;
//是否在圓角矩形的,縱向矩形內
if( p.x > lx && p.x < rx && p.y > (ly-r) && p.y < (ry+r) ) return true;
//不發生碰撞
return false;
}
相關推薦
cocos2dx[2.x](22)--簡單碰撞檢測
【嘮叨】 本節來講講簡單的物理碰撞檢測(非Box2D物理碰撞):矩形、圓之間的碰撞檢測。 【3.x】 將數學類 CCPoint、CCRect 改為v3.x版本的 Vec2、Rect 就好了。 【簡單碰撞檢測】 在一些遊戲中經常會遇到碰撞檢測的情況,
cocos2dx基礎篇(25) 簡單碰撞檢測
【3.x】 將數學類 CCPoint、CCRect 改為v3.x版本的 Vec2、Rect 就好了。 【簡單碰撞檢測】 在一些遊戲中經常會遇到碰撞檢測的情況,如憤怒的小鳥飛出去後,是否與石頭髮生碰撞。 雖然說有一個Box2D物理碰撞引擎,但
cocos2dx 3.x 物理引擎接觸檢測掩碼、碰撞掩碼和類別掩碼問題解析
言簡意賅,物體的類別掩碼CategoryBitMask和物體的接觸測試掩碼ContactTestBitmask邏輯“與”運算結果非零,則觸發EventListenerPhysicsContact事件監聽器,物體的類別掩碼CategoryBitMask和物體
cocos2dx-2.x的eclipse打包apk
必備安裝環境:java jdk安裝以及環境變數,python執行環境 cocos2dx 2.2.2版本是通過python指令碼建立的,指令碼位置:cocos2d-x-2.2.2\tools\project-creator\create_project.py; 這裡可以
cocos2dx-2.x CCFileUtils檔案管理類分析
cocos2dx檔案管理類是一個很重要的類,這裡對這個類進行一下分析: CCFileUtils是檔案管理類的基類,不同平臺下android,ios,win32都有 繼承於這個類的子類,如android class CC_DLL CCFileUtilsAndroid :
cocos2dx[2.x](19)--基本動畫CCAnimation/CCAnimate
【嘮叨】 基本動畫製作需要用到CCAnimation類,用於儲存動畫相關的資訊。以及由CCActionInterval繼承的CCAnimate動畫動作。 還有一些在建立動畫動作的過程中,可能會用到的一些類CCSpriteFrame、CCSpriteFrameC
cocos2dx[2.x](17)--擴充套件動作CCGridAction
【嘮叨】 CCActionInterval除了上節講的基本動作外,還有其他許多的擴充套件動作CCGridAction。顧名思義,就是將顯示的內容分為一塊塊小格子,然後在格子的基礎上進行一些圖形的變換。 【3.x】 (1)去掉“CC” (2)其他變化不
unity3d 簡單碰撞檢測程式碼
function OnCollisionEnter(theCollision : Collision){ if(theCollision.gameObject.name == “Floor”){ Debug.Log(“Hit the floor”); }else
將舊專案基於cocos2dx 2.x的除錯繪製轉移到cocos2dx 3.x中
1、首先必須修改原先在draw函式中繪製渲染的方式。3.x不是直接呼叫draw函式進行繪製的,而是通過renderCommand進行延時渲染。 老專案的渲染方式-draw函式中呼叫 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS
cocos2dx[2.x](16)--基本動作CCAction
【嘮叨】 在電影裡,角色的運動就是動作。而在遊戲裡,動畫就是角色的動作了。例如人物走動、跳躍、釋放魔法,鳥兒飛翔,車輪滾動等。動作是遊戲中不可或缺的重要組成部分,使得遊戲更具魅力,變得豐富活力。 cocos2dx引擎為我們提供了十分豐富的CCAction動作系
cocos2dx 2.x版本在android下CCLabelTTF的一個bug
cocos2dx在android下是採用Paint來生成圖片然後在CCLabelTTF裡顯示的,它具體的程式碼都在java類Cocos2dxBitmap裡,生成完成之後會呼叫一個jni函式將結果傳給cpp層,cpp層靠一個static變數來與java層交換資料,具體如下
實例介紹Cocos2d-x中Box2D物理引擎:碰撞檢測
函數實現 pda creates pty blank oid rtu and 重構 在Box2D中碰撞事件通過實現b2ContactListener類函數實現,b2ContactListener是Box2D提供的抽象類,它的抽象函數:virtual void BeginC
Cocos2d-x 3.0中 物理碰撞檢測中onContactBegin回調函數不響應問題
track 後來 which compare mar details egl def trac 好吧,事實上這篇也是暫時冒出來的,近期朋友要做個物理遊戲,曾經做物理還是用box2d,呃。確實要花些功夫才幹搞懂當中的精髓,可是聽講這套引擎又一次封裝了一次。要easy非
cocos2d x遊戲開發系列教程 坦克大戰遊戲之子彈的碰撞檢測處理
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
play1.2.x簡單的傳送郵件例子
對於PlayFramework框架不瞭解的朋友可以參照此部落格進行配置,部落格地址: http://blog.csdn.net/wangran51/article/details/9357997。然後就是在controllers包中新建EmailAction類,總體來說play框架出來的時間已經不
Hadoop 2.x與3.x 22點比較:3.x將節省大量儲存空間
問題導讀 1.Hadoop3.x通過什麼方式來容錯? 2.Hadoop3.x儲存開銷減少了多少? 3.Hadoop3.x MR API是否相容hadoop1.x? 在這篇文章中,我們將討論Hadoop 2.x與Hadoop
Spark2.x學習筆記:2、Scala簡單例子
2、 Scala簡單例子2.1 互動式程式設計spark-shell是Spark互動式執行模式,提供了互動式程式設計,邊敲程式碼邊執行,不需要建立程式原始檔,方便除錯程式,有利於快速學習Spark。[[email protected] spark-2.2.0]# bin/spark-shell U
cocos2dx 精靈的碰撞檢測和消滅(3)
在上一篇的基礎上增加了一點內容,必要的註釋都寫在程式碼裡了,,就直接貼程式碼吧,我也懶得寫詳細的過程。 HelloWorldSence.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #in
cocos2dx物理引擎和碰撞檢測(六)物體Bodies
前面已經講到形狀和框架的含義,它們分別是用來進行碰撞檢測和物理模擬的物件。到現在我們建立的物理世界當中,還未存在任何的物體。因此接下來的內容就介紹物理世界的主角:物體(Body)。它是構成世界的主要因素,因為不僅框架,形狀會依附於物體,就連後面介紹的關節也是要繫結在物體之上
Unity5.5.2碰撞檢測碰撞點座標問題
1.先說下發生碰撞檢測的條件吧: ①發生碰撞的兩物體都必須掛有碰撞器(Collider)。 ②運動的物體身上必須掛有剛體。 2.接下來是碰撞檢測獲取碰撞資訊的方法 using System.Collections; usin