天天看點

cocos2d-x 定義圓形類 進行圓形與方形、圓形與圓形碰撞檢測

cocos2d-x 隻有Rect(方形)類,也隻有方形之間的碰撞檢測方法。

圓形是方形以外最常用的形狀,也需要與圓形或方形做碰撞檢測。于是自定義圓形區域類,代碼如下。

CCCircle.h檔案

[cpp]  view plain copy print ?

  1. #pragma once  
  2. #include "cocos2d.h"  
  3. USING_NS_CC;  
  4. class CCCircle  
  5. {  
  6. public:  
  7.     CCCircle(void);  
  8.     CCCircle(cocos2d::CCPoint& center, float radius); //提供圓心與半徑 初始化圓  
  9.     ~CCCircle(void);  
  10.     bool intersectsRect(cocos2d::CCRect& rect) const;//是否與長方形區域相交  
  11.     bool intersectsCircle(CCCircle& circle) const;//是否與圓形區域相交  
  12. private:  
  13.     CC_SYNTHESIZE(cocos2d::CCPoint,m_center,MCenter);//圓心  
  14.     CC_SYNTHESIZE(float,m_radius,MRadius);//半徑  
  15. };  
  16. #define CCCircMake(ccPoint, radius) CCCircle::CCCircle(ccPoint, (float)(radius))  

CCCircle.cpp檔案

[cpp]  view plain copy print ?

  1. 1.#include "CCCircle.h"  
  2. 2.   
  3. 3.#include "cocos2d.h"  
  4. 4.   
  5. USING_NS_CC;  
  6. 6.   
  7. 7.CCCircle::CCCircle(void):  
  8. 8.m_center(CCPoint(0,0)),m_radius(0)  
  9. 9.{  
  10. 10.}  
  11. 11.   
  12. 12.CCCircle::CCCircle(cocos2d::CCPoint& center, float radius):  
  13. 13.m_center(center),m_radius(radius){  
  14. 14.}  
  15. 16.CCCircle::~CCCircle(void)  
  16. 17.{  
  17. 18.}  
  18. 19.   
  19. 20.//判斷圓與方形區域是否相交  
  20. 21.bool CCCircle::intersectsRect( cocos2d::CCRect& rect ) const  
  21. 22.{  
  22. 23. int arcR = (int)m_radius;//圓形半徑  
  23. 24. int arcOx = (int)m_center.x;//圓心X坐标  
  24.     int arcOy = (int)m_center.y;//圓心Y坐标  
  25. 26. int rectX = (int)rect.getMinX();//長方形左上角X坐标  
  26. 27. int rectY = (int)rect.getMaxY();//長方形右上角Y坐标  
  27. 28. int rectW = rect.getMaxX()-rectX;//長方形寬  
  28. 29. int rectH = rect.getMaxY()-rectY;//長方形高  
  29. 30.   
  30. 31. if(((rectX-arcOx) * (rectX-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)  
  31. 32.     return true;  
  32. 33. if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY-arcOy) * (rectY-arcOy)) <= arcR * arcR)  
  33. 34.     return true;  
  34.     if(((rectX-arcOx) * (rectX-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)  
  35. 36.     return true;  
  36. 37. if(((rectX+rectW-arcOx) * (rectX+rectW-arcOx) + (rectY+rectH-arcOy) * (rectY+rectH-arcOy)) <= arcR * arcR)  
  37. 38.     return true;  
  38. 39. //分别判斷矩形4個頂點與圓心的距離是否<=圓半徑;如果<=,說明碰撞成功  
  39. 40.   
  40. 41.   
  41. 42. int minDisX = 0;  
  42. 43. if(arcOy >= rectY && arcOy <= rectY + rectH){  
  43. 44.     if(arcOx < rectX)  
  44.             minDisX = rectX - arcOx;  
  45. 46.     else if(arcOx > rectX + rectW)  
  46. 47.         minDisX = arcOx - rectX - rectW;  
  47. 48.     else   
  48. 49.         return true;  
  49. 50.     if(minDisX <= arcR)  
  50. 51.         return true;  
  51. 52. }//判斷當圓心的Y坐标進入矩形内時X的位置,如果X在(rectX-arcR)到(rectX+rectW+arcR)這個範圍内,則碰撞成功  
  52. 53.   
  53. 54. int minDisY = 0;  
  54.     if(arcOx >= rectX && arcOx <= rectX + rectW){  
  55. 56.     if(arcOy < rectY)  
  56. 57.         minDisY = rectY - arcOy;  
  57. 58.     else if(arcOy > rectY + rectH)  
  58. 59.         minDisY = arcOy - rectY - rectH;  
  59. 60.     else  
  60. 61.         return true;  
  61. 62.     if(minDisY <= arcR)  
  62. 63.         return true;  
  63. 64. }//判斷當圓心的X坐标進入矩形内時Y的位置,如果X在(rectY-arcR)到(rectY+rectH+arcR)這個範圍内,則碰撞成功  
  64.     return false;  
  65. 66.}  
  66. 67.   
  67. 68.//判斷兩圓是否相交  
  68. 69.bool CCCircle::intersectsCircle( CCCircle& circle ) const  
  69. 70.{  
  70. 71. //圓心之間的距離小于兩圓半徑之和即相交  
  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) {    
  72. 73.     return false;    
  73. 74. }    
  74.     return true;   
  75. 76.}