cocos2d-x 隻有Rect(方形)類,也隻有方形之間的碰撞檢測方法。
圓形是方形以外最常用的形狀,也需要與圓形或方形做碰撞檢測。于是自定義圓形區域類,代碼如下。
CCCircle.h檔案
[cpp] view plain copy print ?
- #pragma once
- #include "cocos2d.h"
- USING_NS_CC;
- class CCCircle
- {
- public:
- CCCircle(void);
- CCCircle(cocos2d::CCPoint& center, float radius); //提供圓心與半徑 初始化圓
- ~CCCircle(void);
- bool intersectsRect(cocos2d::CCRect& rect) const;//是否與長方形區域相交
- bool intersectsCircle(CCCircle& circle) const;//是否與圓形區域相交
- private:
- CC_SYNTHESIZE(cocos2d::CCPoint,m_center,MCenter);//圓心
- CC_SYNTHESIZE(float,m_radius,MRadius);//半徑
- };
- #define CCCircMake(ccPoint, radius) CCCircle::CCCircle(ccPoint, (float)(radius))
CCCircle.cpp檔案
[cpp] view plain copy print ?
- 1.#include "CCCircle.h"
- 2.
- 3.#include "cocos2d.h"
- 4.
- USING_NS_CC;
- 6.
- 7.CCCircle::CCCircle(void):
- 8.m_center(CCPoint(0,0)),m_radius(0)
- 9.{
- 10.}
- 11.
- 12.CCCircle::CCCircle(cocos2d::CCPoint& center, float radius):
- 13.m_center(center),m_radius(radius){
- 14.}
- 16.CCCircle::~CCCircle(void)
- 17.{
- 18.}
- 19.
- 20.//判斷圓與方形區域是否相交
- 21.bool CCCircle::intersectsRect( cocos2d::CCRect& rect ) const
- 22.{
- 23. int arcR = (int)m_radius;//圓形半徑
- 24. int arcOx = (int)m_center.x;//圓心X坐标
- int arcOy = (int)m_center.y;//圓心Y坐标
- 26. int rectX = (int)rect.getMinX();//長方形左上角X坐标
- 27. int rectY = (int)rect.getMaxY();//長方形右上角Y坐标
- 28. int rectW = rect.getMaxX()-rectX;//長方形寬
- 29. int rectH = rect.getMaxY()-rectY;//長方形高
- 30.
- 31. if(((rectX-arcOx) * (rectX-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)
- 32. return true;
- 33. if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)
- 34. return true;
- if(((rectX-arcOx) * (rectX-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)
- 36. return true;
- 37. if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)
- 38. return true;
- 39. //分别判斷矩形4個頂點與圓心的距離是否<=圓半徑;如果<=,說明碰撞成功
- 40.
- 41.
- 42. int minDisX = 0;
- 43. if(arcOy >= rectY && arcOy <= rectY + rectH){
- 44. if(arcOx < rectX)
- minDisX = rectX - arcOx;
- 46. else if(arcOx > rectX + rectW)
- 47. minDisX = arcOx - rectX - rectW;
- 48. else
- 49. return true;
- 50. if(minDisX <= arcR)
- 51. return true;
- 52. }//判斷當圓心的Y坐标進入矩形内時X的位置,如果X在(rectX-arcR)到(rectX+rectW+arcR)這個範圍内,則碰撞成功
- 53.
- 54. int minDisY = 0;
- if(arcOx >= rectX && arcOx <= rectX + rectW){
- 56. if(arcOy < rectY)
- 57. minDisY = rectY - arcOy;
- 58. else if(arcOy > rectY + rectH)
- 59. minDisY = arcOy - rectY - rectH;
- 60. else
- 61. return true;
- 62. if(minDisY <= arcR)
- 63. return true;
- 64. }//判斷當圓心的X坐标進入矩形内時Y的位置,如果X在(rectY-arcR)到(rectY+rectH+arcR)這個範圍内,則碰撞成功
- return false;
- 66.}
- 67.
- 68.//判斷兩圓是否相交
- 69.bool CCCircle::intersectsCircle( CCCircle& circle ) const
- 70.{
- 71. //圓心之間的距離小于兩圓半徑之和即相交
- 72. if (sqrt(pow(m_center.x- circle.m_center.x,2)+pow(m_center.y-circle.m_center.y,2))>m_radius+circle.m_radius) {
- 73. return false;
- 74. }
- return true;
- 76.}