1. 程式人生 > >cocos2dx[2.x](22)--簡單碰撞檢測

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